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

本文介绍了一种使用OpenCV在Windows程序中显示图像的方法。通过将图像数据转换为Windows位图格式,并利用设备上下文进行绘制,实现了图像的有效显示。文章提供了具体的代码示例及图像显示的效果对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值