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

7 篇文章 0 订阅
7 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值