接上文 VS2013 MFC + OpenCV3.0 打开图片;
既然我们已经从 OpenCV1.0 走到了 OpenCV2.0 乃至更高,又何苦在写基于 MFC 的图像处理程序时,又回到 OpenCV 旧式的语法结构。
如此优雅的方式,见于知乎 在 MFC 框架中,有什么方法能直接将 OpenCV 2.0 库中 Mat 格式的图片传递到 Picture Control(图片控件)显示?
我们直接进入代码修改部分:
1. 添加所需的头文件
在 C**Dlg 类所对应的头文件(**Dlg.h)中添加:
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include "CvvImage.h"
2. 创建 OpenCV 窗口
在 C**Dlg.h 类所对应的源文件(**Dlg.cpp)的 BOOL CMFC_DEMODlg::OnInitDialog()
添加:
cv::namedWindow("view", cv::WINDOW_AUTOSIZE);
HWND hWnd = (HWND)cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
3. 响应鼠标左键,显示图像
在 OnBnClickedOpenImage 函数体内:
cv::Mat img = cv::imread("./BaboonRGB.bmp");
cv::imshow("view", img);
4. 修正一个问题
view窗口句柄的方法,虽然设置的view窗口是在相应ID的PictureControl上显示了,但显示的图片仍保持原本的尺寸大小,而不是根据在对话框中的PictureControl窗口大小自适应显示;
所以,在调用imshow(“view”, img) 前最好先加上:
cv::Mat m_dst;
cv::Mat img = cv::imread("./BaboonRGB.bmp");
CRect rect;
GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
cv::Rect dst(rect.left, rect.top, rect.right, rect.bottom);
cv::resize(img, m_dst, cv::Size(rect.Width(), rect.Height()));
// 需要添加 #include <opencv2/imgproc/imgproc.hpp>
cv::imshow("view", m_dst);