在 MFC 框架中,直接将 OpenCV2.0/3.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);

第二种方法:

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);
 }
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值