Vscode Linux下opencv及多线程socket(3)--Apple的学习笔记

继承我的上一篇文章Vscode mingw下opencv及多线程socket(2)--Apple的学习笔记中待完成任务。

一,本周做了变更(版本变更为0.3)

1. HMI图片显示添加ROI区域显示张数及叠加特质logo。
2. Server端切换到linux系统上。
3. recv存阻塞修改设计为select IO复用的异步形式,实现了断线也能重连的功能。
4. 对client测试code的重连函数中connect函数也使用非阻塞,加快重连速度。

注:client地址设置为192.168.1.111,server地址设置为192.168.1.110
工程共享路径(在code/03文件夹中): https://github.com/AppleCai/Display

二,后续更新版本说明:

之前的2.4/2.5算完成了,后续需要完成

2.6 重构HMI,分离为一个进程。
2.7 添加对图片的监视作用,添加弹窗报警及logDTC记录。(目的是使用进程间通信和共享内存)
2.8 添加守护进程。
2.9 进行性能测试,进行优化。

三,图片叠加设计说明

关于添加log及页数的方法:
每收到一帧则页数加1,将页数转为单个的字符串,自己制作0~9及logo的图片。将个十百千数字的位置及logo的位置固定后,进行opencv的ROI区域叠加即可。在原有函数中添加ROIhandler处理函数。

    void HMI::ROIhandler(ServerEx *serv)
    {
        /* Add logo ROI */
        cv::Mat mylogo = cv::imread("./pic/logo.png");
        cv::Mat imgROIlogo = serv->Img(cv::Rect(0, 0, mylogo.cols, mylogo.rows));
        mylogo.copyTo(imgROIlogo, mylogo);
    
        std::string suffix = ".png";
        /* int to string */
        std::string res = std::to_string(serv->page);
        /* stuff zero on the right*/
        while (res.size() < 4)
        {
          res = "0" + res;
        }
        /* setting number ROI get each item in string */
        cv::Mat numthousand = cv::imread("./pic/" + res.substr(0, 1) + suffix);
        cv::Mat imgROInumthousand = serv->Img(cv::Rect(mylogo.cols + 10, 0, numthousand.cols, numthousand.rows));
        numthousand.copyTo(imgROInumthousand, numthousand);
    
        cv::Mat numhundred = cv::imread("./pic/" + res.substr(1, 1) + suffix);
        cv::Mat imgROInumhundred = serv->Img(cv::Rect(mylogo.cols + 30, 0, numhundred.cols, numhundred.rows));
        numhundred.copyTo(imgROInumhundred, numhundred);
    
        cv::Mat numtens = cv::imread("./pic/" + res.substr(2, 1) + suffix);
        cv::Mat imgROInumtens = serv->Img(cv::Rect(mylogo.cols + 50, 0, numtens.cols, numtens.rows));
        numtens.copyTo(imgROInumtens, numtens);
    
        cv::Mat numunits = cv::imread("./pic/" + res.substr(3, 1) + suffix);
        cv::Mat imgROInumunits = serv->Img(cv::Rect(mylogo.cols + 70, 0, numunits.cols, numunits.rows));
        numunits.copyTo(imgROInumunits, numunits);
    }
    
    void HMI::DisplayFrame(ServerEx *serv)
    {
      if ((this->_showEn == TRUE) && (serv->revOK == TRUE))
      {
        ROIhandler(serv);
        /* show picture */
        cv::imshow("pic", serv->Img);
        cv::waitKey(1);
      }
    }

四,关于select模型的设计说明

一开始调试的时候,select过一段时间后就会一直返回0。明明已经设置了timeout时间为3s,这是为什么。通过wireshark监控没有发现超时,最后才知道每次select调用的时候timeout需要重新初始化为3s。
经过修改后,除非断线,否则不会返回0。因为一帧图片数据在1s内即可传输完毕。select函数的设计框架如下。

      this->myServerEx->select_zero();
      this->myServerEx->select_set();
      //重新select需要重新设置timeout值
      ret = this->myServerEx->myselect();
      if (ret == -1)
      {
          //出错处理
      }
      else if (ret == 0)
      {
          //超时处理
      }
      else
      {
          if (this->myServerEx->select_iset())
          {
              //正常执行
          }
      }
    void ServerEx::select_clr()
    {
      FD_CLR(this->getConnectfd(), &this->read_fds);
    }
    void ServerEx::select_zero()
    {
      FD_ZERO(&this->read_fds);
    }
    void ServerEx::select_set()
    {
      FD_SET(this->getConnectfd(), &this->read_fds);
    }
    int ServerEx::select_iset()
    {
      return (FD_ISSET(this->getConnectfd(), &this->read_fds));
    }
    int ServerEx::myselect()
    {
      this->tv.tv_sec=3;   //reset the timeout value
      this->tv.tv_usec=0;
      return (select(this->getConnectfd() + 1, &this->read_fds, NULL, NULL, &this->tv));
    }

五,运行效果图

实际效果.png

client.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266