在MFC的picture控件中如何显示Mat图

  1.  
  2. 首先,要进行输入检查,看Mat数据是否是有效的,如下图中所示

    在MFC的picture控件中如何显示Mat图

  3. 定义位图数据结构,用以方便在图形设备接口(GraphicsDeviceInterface)上显示,也就是windows上的GDI

    在MFC的picture控件中如何显示Mat图

  4. 开发内存空间,并初始化,按下图中所示那样即可

    在MFC的picture控件中如何显示Mat图

  5. 定义位图相关信息,并和输入数据Mat图联系起来

    在MFC的picture控件中如何显示Mat图

    在MFC的picture控件中如何显示Mat图

  6. 在获取控件的客户区,并设置图像的显示模式,SetStretchBltMode是Windows GDI函数,功能为该函数可以设置指定设备环境中的位图拉伸模式。COLORONCOLOR:删除像素。该模式删除所有消除的像素行,不保留其信息。

    在MFC的picture控件中如何显示Mat图

  7. 完成上述后,将内存中的图像数据拷贝到屏幕上,执行如下图中所示

    在MFC的picture控件中如何显示Mat图

  8. 上面写了显示的关键步骤,下面贴上详细源码,以方便大家理解:

    void showMatImgToWnd(CWnd* pWnd, const cv::Mat& img)

        if(img.empty()) 

            return; 

     static BITMAPINFO *bitMapinfo = NULL;

     static bool First=TRUE;

     if(First)

     {  

      BYTE *bitBuffer = new BYTE[40+4*256];//开辟一个内存区域

      if(bitBuffer == NULL)

      { 

       return;

      }

      First=FALSE;

      memset(bitBuffer, 0, 40+4*256);

      bitMapinfo = (BITMAPINFO *)bitBuffer;

      bitMapinfo->bmiHeader.biSize   = sizeof(BITMAPINFOHEADER);

      bitMapinfo->bmiHeader.biPlanes   = 1;   

      for(int i=0; i<256; i++)

      { //颜色的取值范围 (0-255)

       bitMapinfo->bmiColors[i].rgbBlue  =bitMapinfo->bmiColors[i].rgbGreen =bitMapinfo->bmiColors[i].rgbRed   =(BYTE) i;

      } 

      }

      bitMapinfo->bmiHeader.biHeight = -img.rows;   

           bitMapinfo->bmiHeader.biWidth = img.cols;

     bitMapinfo->bmiHeader.biBitCount= img.channels() *8;    

     

     CRect drect;       

     pWnd->GetClientRect(drect);    //pWnd指向CWnd类的一个指针 

     CClientDC dc(pWnd);

     HDC hDC =dc.GetSafeHdc();                  //HDC是Windows的一种数据类型,是设备描述句柄;

     SetStretchBltMode(hDC, COLORONCOLOR);    

                                              StretchDIBits(hDC,

         0,

         0,

         drect.right,  //显示窗口宽度

         drect.bottom,  //显示窗口高度

         0,

         0,

         img.cols,     //图像宽度

         img.rows,     //图像高度

         img.data,   

         bitMapinfo,   

         DIB_RGB_COLORS, 

         SRCCOPY

          );

    }

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值