Opencv对图像的显示,有自带的imshow函数完成。但是,如果需要在windows程序中显示图像的时候,就有点小麻烦了。
现介绍一种方法,是在《Learning openCV Second Edition》中介绍的。
代码如下所示:
void CShowPicToDlgDlg::OnBnClickedOk() { RGBTRIPLE* m_bitmapBits; //读取图片 Mat cv_pic_src = imread("11.jpg", CV_LOAD_IMAGE_COLOR); //申请图片使用的内存 m_bitmapBits = new RGBTRIPLE[cv_pic_src.cols * cv_pic_src.rows]; //声明一个mat Mat cv_header_to_dlg_image( Size( cv_pic_src.cols, cv_pic_src.rows ), CV_8UC3, m_bitmapBits ); //图像格式转换 cvtColor( cv_pic_src, cv_header_to_dlg_image, CV_BGR2RGB ); //获取绘制区域和设备 CClientDC dc(this); CRect rect; GetClientRect(&rect); //声明BITMAPINFO头,并将图像贴到设备上。 BITMAPINFO bmi = {0}; bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biWidth = cv_pic_src.cols; bmi.bmiHeader.biHeight = cv_pic_src.rows * -1; //注意这里,因为BITMAPINFO中数据是反的,因此需要乘 -1 bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; ::StretchDIBits( dc.GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, bmi.bmiHeader.biWidth, abs(bmi.bmiHeader.biHeight), m_bitmapBits, &bmi, DIB_RGB_COLORS, SRCCOPY ); namedWindow("test"); imshow("test", cv_header_to_dlg_image); waitKey(0); }
通过imshow显示效果如下:
但是实际的图片是这样的:
从这里看,CV_BGR2RGB 转换好像存在颜色上的不确认。到底是什么原因,需要进一步研究。