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 转换好像存在颜色上的不确认。到底是什么原因,需要进一步研究。