第一种方法:
我们直接进入代码修改部分:
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);
第二种方法:
void CXXXDlg::DrawMat(cv::Mat& img, UINT nID)
{
cv::Mat imgTmp;
CRect rect;
GetDlgItem(nID)->GetClientRect(&rect); // 获取控件大小
cv::resize(img, imgTmp, cv::Size(rect.Width(), rect.Height()));// 缩放Mat并备份 // 转一下格式 ,这段可以放外面,
switch (imgTmp.channels())
{
case 1:
cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY单通道
break;
case 3:
cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA); // BGR三通道
break;
default:
break;
}
int pixelBytes = imgTmp.channels()*(imgTmp.depth() + 1); // 计算一个像素多少个字节 // 制作bitmapinfo(数据头)
BITMAPINFO bitInfo;
bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;
bitInfo.bmiHeader.biWidth = imgTmp.cols;
bitInfo.bmiHeader.biHeight = -imgTmp.rows;
bitInfo.bmiHeader.biPlanes = 1;
bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitInfo.bmiHeader.biCompression = BI_RGB;
bitInfo.bmiHeader.biClrImportant = 0;
bitInfo.bmiHeader.biClrUsed = 0;
bitInfo.bmiHeader.biSizeImage = 0; bitInfo.bmiHeader.biXPelsPerMeter = 0; bitInfo.bmiHeader.biYPelsPerMeter = 0; // Mat.data + bitmap数据头 -> MFC CDC *pDC = GetDlgItem(nID)->GetDC();
::StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), imgTmp.data, &bitInfo, DIB_RGB_COLORS, SRCCOPY );
ReleaseDC(pDC);
}