利用GDI+在MFC中显示OpenCV中的Mat图像的关键点

本文讨论了在MFC环境下使用GDI+显示OpenCV Mat图像时遇到的问题,即图像宽度需为4的倍数才能成功绘制。通过分析原因并提供解决方案,确保图像能正常显示。

在正确初始化了GDI+库,并且在InitInstance中启动了GDI+,在ExitInstance中关闭了GDI+,然后利用以下代码显示Mat图像时:

CRect rect;
m_image_sel.GetClientRect(rect);
Gdiplus::Bitmap bitmap(img.cols, img.rows, img.step[0], //每一行的字节数
	PixelFormat24bppRGB, (BYTE*)img.data);
CDC * pDC = m_image_sel.GetDC();		// m_image_sel是一个PictrueCtrl控件
Gdiplus::Graphics g(pDC->GetSafeHdc());
Gdiplus::Status s = g.DrawImage(&bitmap, 0, 0);
UpdateWindow();

实践中发现,这么做并不是百分百成功的,当图像的宽度(也就是代码中的img.cols)不能被4整除时,Bitmap对象就会初始化失败(跟图像存储的4字节对齐有关系?),当图像的宽度正好是4的倍数的时候,图像就能正常绘制。

尝试了下加入下面这段代码:

if (img.isContinuous())
{
	// 判断数据是否连续,不连续则对齐数据
	img.reshape(1, img.cols * img.rows);
}

执行之后仍然和原来一样,暂时没有找到原因。目前的结论就是,如果想用这种方法使用GDI+在MFC中显示Mat图像的话,就必须要求这个图像的宽度是4的倍数,否则无法正常显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值