多线程,借助Opencv在MFC的picture控件上不断刷新显示的问题

dugulieyang 2011-07-06 09:40:46
MFC显示图片是主线程,另开了一个线程采集图片放到一个全局变量(Mat类型)当中,MFC显示图片这个主线程将全局变量中的图片数据强制转化为IplImage 类,通过函数DrawPicToHDC显示到控件上。
图片数据转换及显示的代码如下:
IplImage depth_temp=IplImage(mDepth);
DrawPicToHDC(&depth_temp,IDC_PIC_DEPTH);

然后调用Invalidate(false);
不断在Onpaint函数中重绘达到连续显示图片成为连续画面的效果。

DrawPicToHDC函数如下:
void CPlatform_GameDlg::DrawPicToHDC(IplImage *img, UINT ID)
{
CDC *pDC=GetDlgItem(ID)->GetDC();
HDC hDC=pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
if(img->nChannels != 1)
{
cimg.CopyOf(img);
}
else
{
CvvImage img1;
img1.Create(img->width,img->height,8*3,img->origin);
cvConvertImage(img, img1.GetImage(), CV_GRAY2RGB);
cimg.CopyOf(img1, 0);
}
cimg.DrawToHDC(hDC,&rect);
ReleaseDC(pDC);
}

然后当开始运行的时候没问题,当程序运行时间稍长,不知道什么时候就出错误了,错误如下:


First-chance exception at 0x7538b760 in Platform_Game.exe: Microsoft C++ exception: cv::Exception at memory location 0x001ce188..
Unhandled exception at 0x7538b760 in Platform_Game.exe: Microsoft C++ exception: cv::Exception at memory location 0x001ce188..

求高人指点……?onpaint中直接调用invalidate(false);刷新界面貌似不太恰当,运行久了会出这个问题吗?
...全文
461 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Tiny 2012-07-18
  • 打赏
  • 举报
回复
楼主什么情况啊,你这个问题最后怎么解决的额,我现在遇到了,分享下你怎么搞定的,谢谢!!!
ryfdizuo 2011-07-06
  • 打赏
  • 举报
回复
时间长了,是不是内存泄露的问题。。
opencv 的highgui就是win32写的,可以直接把cvWindow的挂在对话框下。
dugulieyang 2011-07-06
  • 打赏
  • 举报
回复
我把invalidate(false);去掉了,改成用定时器了。
cvWindow……我看一下

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧