多线程,借助Opencv在MFC的picture控件上不断刷新显示的问题
图片数据转换及显示的代码如下:
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);刷新界面貌似不太恰当,运行久了会出这个问题吗?
相关推荐
利用MFC的Picture控件显示图像和视频/摄像头画面(VS2008+OpenCV2.0)
利用MFC的Picture控件显示和处理图像,后面又添加了播放视频和捕获摄像头画面的功能,其中播放视频的功能只有 'Play' 和 'Stop',不能实现暂停
MFC与OpenCV混合编程:IplImage转DIB显示与配置全解
在Windows桌面应用开发中,MFC与OpenCV的整合是常见需求,MFC提供成熟的界面框架,OpenCV擅长图像算法,但两者的数据格式与渲染机制互不兼容。核心问题在于如何将OpenCV的IplImage或cv::Mat像素数据转换为MFC可绘制的DIB位图。通过自定义转换类,如Ipl2DIB和CBitmapEx,可实现图像在对话框Picture控件上的实时显示。技术价值在于避免引入第三方界面库,原生融合两种技术栈。该方案适用于工业相机取流、老项目升级及上位机开发。同时,对于控制台程序启用MFC、多线程处
MFC中集成OpenCV:从Mat到Picture Control的完整实践
在Windows桌面应用开发中,将图像处理与界面框架灵活结合是工程实践中的常见挑战。OpenCV提供了丰富的视觉算法,而MFC则是传统Windows应用的成熟界面框架。两者结合时,开发者往往面临消息循环冲突、像素格式差异以及跨线程取帧等基础问题。理解cv::Mat与Windows DIB的存储布局差异,利用StretchDIBits完成高效的图像绘制,并通过工作线程与PostMessage机制避免UI阻塞,是实现流畅相机预览、动态缩放和二维码识别等场景的关键技术路径。本文从环境配置出发,逐步解析像素转换、双
vs2015+opencv3.3+mfc读取摄像头显示在图片控件Picture Control
在前辈的基础上做了一些改进,适用于vs2015+opencv3.3
利用MFC鼠标消息响应事件实现在picture control控件上图像ROI区域选定与裁剪
利用vs2010MFC对话框的鼠标消息函数RBBUTTONDOWN,ONMOUSEMOVE,RBBUTONUP实现在picture control控件上选定图像的矩形ROI感兴趣区域,并裁剪显示出所选定的ROI区域。按住鼠标右键,拖动光标划定矩形区域,再弹起鼠标右键即完成一次ROI区域选定。


