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.pngmy2.png