在正确初始化了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的倍数,否则无法正常显示。
本文讨论了在MFC环境下使用GDI+显示OpenCV Mat图像时遇到的问题,即图像宽度需为4的倍数才能成功绘制。通过分析原因并提供解决方案,确保图像能正常显示。

1201

被折叠的 条评论
为什么被折叠?



