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的图像(即灰度图像和彩色图像),其他未进行测试
运行效果
作者: mr-xbt
本文来自博客园: https://www.cnblogs.com/xbotao/articles/6058277.html
如有问题,请留言或者Email我: upc_xbt 163.com