将Opencv,Mat类型图片贴图到windows显示设备中

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);
	
}


显示效果如下:

将Opencv,Mat类型图片贴图到windows显示设备中

通过imshow显示效果如下:

将Opencv,Mat类型图片贴图到windows显示设备中


但是实际的图片是这样的:

将Opencv,Mat类型图片贴图到windows显示设备中


从这里看,CV_BGR2RGB 转换好像存在颜色上的不确认。到底是什么原因,需要进一步研究。

将Opencv,Mat类型图片贴图到windows显示设备中

上一篇:WAMP Server 和IIS 7如何在Windows中同时运行


下一篇:Win7开启远程桌面——图文详解