VS2017 MFC的Picture Control控件显示opencv3.3图片的方法

环境: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刷为灰色。

本人更倾向于使用方法二!

  • 2
    点赞
  • 16
    收藏
  • 打赏
    打赏
  • 3
    评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

叫我小红

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值