C++Visual Studio Code

Vscode Linux下opencv及多进程socket(4)

2019-06-01  本文已影响1人  applecai

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

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

1. 将HMI线程改为进程。
2. 添加IPC消息传递,共享内存和信号灯的使用。
3. 实现HMI显示的控制(按键j)及保存显示图片的功能(按键k)

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

二,后续更新版本说明:

之前的2.6/2.7算完成了,后续需要完成

2.8 代码优化,添加守护进程。
2.9 进行性能测试,进行优化。

三,图片叠加设计说明

HMI子进程处理如下:接收2个group的消息并且读取共享内存并且显示。
group等于1为主进行sokect线程读取一帧图片后发来的消息。
group等于2为主进程的key线程发来的消息(key=j和key=p)。
HMI主要code如下:
    else if (id == 0) //child read
    {
        std::vector<uchar> imgvec;
        MYmsg::Msg recvbuf,cmdbuf;
        cmdbuf.buf[0]=0;  //init value,shall show pic
        while (1)
        {
            
            disp->_myServerEx->msg->IPCrecvMsg(&recvbuf,MYGROUP,0);
            disp->_myServerEx->sem->sem_p();
            char *buf = disp->_myServerEx->shm->atAddr();
            for (int i = 0; i < recvbuf.buf[1] ; i++)
            {
                imgvec.push_back(buf[i]);
            }
            disp->_myServerEx->shm->DelAddr(buf);
            disp->_myServerEx->sem->sem_v();
            cv::Mat Img = cv::imdecode(imgvec, CV_LOAD_IMAGE_COLOR);
            imgvec.clear();
            std::vector<uchar>(imgvec).swap(imgvec);
            //cv::imshow("pic", Img);
            //cv::waitKey(1);
            cmdbuf.buf[1]=0; // clear the save bit each cycle
            disp->_mykey->msg->IPCrecvMsg(&cmdbuf,KEYGROUP,IPC_NOWAIT);
            if(0==cmdbuf.buf[0])
            {
                disp->_myHMI->DisplayFrame(Img,recvbuf.buf[0],cmdbuf.buf[1]);
            }
        }
    }

四,运行效果图(图1)按p键后保存的now.jpg如下(图2)

my1.png
my2.png
上一篇下一篇

猜你喜欢

热点阅读