MFC+opencv 显示Mat格式图像

在opencv2.0以下的版本中,主要使用的IplImage格式的图像,转换为CvvImage格式的图像,用来显示

但是在opencv2.0以后的版本中,图像的存储主要使用的是cv::Mat格式的图像,在MFC显示中存在问题,特别是出现图像偏移的问题

以下代码可以实现Mat图像在MFC界面中的显示

 

 1 /*****************************************************
 2 *
 3 * 函数名称: void DrawcvMat(cv::Mat m_cvImg, UINT ID)
 4 * 函数功能: 在picture control中显示图像,设置Freame或者rectangle都可以
 5 *
 6 * ****************************************************/
 7 void CMFC_showImageDemoDlg::DrawcvMat(cv::Mat m_cvImg, UINT ID)
 8 { 
 9     cv::Mat img; 
10     CRect rect; 
11 
12     GetDlgItem(ID)->GetClientRect(&rect);
13     if (rect.Width()%4 != 0)
14     {
15         rect.SetRect(rect.left, rect.top, rect.left + (rect.Width() + 3) / 4 * 4, rect.bottom);  //调整图像宽度为4的倍数
16         GetDlgItem(ID)->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOMOVE);
17     }
18     
19     cv::Rect dst(rect.left, rect.top, rect.right, rect.bottom); 
20     cv::resize(m_cvImg, img, cv::Size(rect.Width(), rect.Height()));  //使图像适应控件大小 
21 
22     unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];    
23     BITMAPINFO* m_bmi = (BITMAPINFO*) m_buffer; 
24     BITMAPINFOHEADER* m_bmih = &(m_bmi->bmiHeader); 
25     memset(m_bmih, 0, sizeof(*m_bmih)); 
26     m_bmih->biSize = sizeof(BITMAPINFOHEADER); 
27     m_bmih->biWidth = img.cols;   //必须为4的倍数
28     m_bmih->biHeight = -img.rows; //在自下而上的位图中 高度为负
29     m_bmih->biPlanes = 1; 
30     m_bmih->biCompression = BI_RGB; 
31     m_bmih->biBitCount = 8 * img.channels(); 
32 
33     if (img.channels() == 1)  //当图像为灰度图像时需要设置调色板颜色
34     {
35         for (int i = 0; i < 256; i++)
36         {
37             m_bmi->bmiColors[i].rgbBlue = i;
38             m_bmi->bmiColors[i].rgbGreen = i;
39             m_bmi->bmiColors[i].rgbRed = i;
40             m_bmi->bmiColors[i].rgbReserved = 0;
41         }
42     }
43 
44     CDC *pDC = GetDlgItem(ID)->GetDC();    
45     ::StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), img.data, (BITMAPINFO*) m_bmi, DIB_RGB_COLORS, SRCCOPY ); 
46     ReleaseDC(pDC); 
47 }


注意:图像在显示时,控件的宽度必须为4的倍数,可以显示深度为1和3的图像(即灰度图像和彩色图像),其他未进行测试

 

运行效果

 

posted @ 2016-11-13 11:01  mr-xbt  阅读(1770)  评论(2编辑  收藏  举报