环境:Win10
Vs2017
opencv3.3
文中涉及
MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数
见我另一篇博文OpenCV中Mat对象转MFC的CImage类的函数
http://blog.csdn.net/weixin_39449570/article/details/78901208
方法一:
下面是实现图片显示的程序,亲测可用:
int cxl, cyl;
Mat rgbImageL1;//opencv图片
CImage rgbImageL2;
CRect rectl, pic_rectl;
int widthl, heightl;
//改变图片大小适应picture控件
GetDlgItem(IDC_pl)->GetClientRect(&pic_rectl);
widthl = pic_rectl.right;
heightl = pic_rectl.bottom;
resize(rgbImageL, rgbImageL1, Size(widthl, heightl));
MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数(见我另一篇博文)
//获取图片的宽 高度
cxl = rgbImageL2.GetWidth();
cyl = rgbImageL2.GetHeight();
//获取Picture Control控件的大小
GetDlgItem(IDC_pl)->GetWindowRect(&rectl);
//将客户区选中到控件表示的矩形区域内
ScreenToClient(&rectl);
//窗口移动到控件表示的区域
GetDlgItem(IDC_pl)->MoveWindow(rectl.left, rectl.top, cxl, cyl, TRUE);
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_pl);//获取控件句柄
pWnd->GetClientRect(&rectl);//获取句柄指向控件区域的大小
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture的DC
rgbImageL2.Draw(pDc->m_hDC, rectl);//将图片绘制到picture表示的区域内
ReleaseDC(pDc);
方法二:
也可以把OpenCV的窗口添加到PictureControl里面,这样你可以继续使用OpenCV的setMouseCallback直接对PictureControl进行鼠标操作。
首先在你的:OnInitDialog()函数中添加如下
namedWindow("disparity", WINDOW_AUTOSIZE);
HWND hWnd = (HWND)cvGetWindowHandle("disparity");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
上面就是打开一个名为view的OpenCV窗口,并将其放置到一个ID为IDC_STATIC的PictureControl里面,这个控件的类型需要是rectangle。当你在需要显示某图片的时候,就像在OpenCV里面显示一样就可以了。
在主程序里添加如下:
//改变图片大小适应picture控件
CRect pic_rect;
int width, height;
GetDlgItem(IDC_STATIC)->GetClientRect(&pic_rect);
width = pic_rect.right;
height = pic_rect.bottom;
resize(color, color1, Size(width, height));
imshow("disparity", color1);
方法二优缺点:
把OpenCV的窗口添加到PictureControl里面,这样你可以继续使用OpenCV的setMouseCallback直接对PictureControl进行鼠标操作。
在使用窗体打开时会有黑窗口闪烁,应该是namedWindow的作用。
初始化时会将picture刷为灰色。