将位图转换为Mat

时间:2014-07-09 13:47:14

标签: c++ opencv bitmap bitmapdata

我需要将Gdiplus :: Bitmap转换为cv :: Map格式。 我使用此代码执行此操作:

Gdiplus::Bitmap* enhanced = ...; // some Bitmap
Gdiplus::BitmapData bmp_data = {};
Gdiplus::Rect rect(0, 0, enhanced->GetWidth(), enhanced->GetHeight());

enhanced->LockBits(&rect, Gdiplus::ImageLockModeRead, enhanced->GetPixelFormat(), &bmp_data);

Mat imageMap(enhanced->GetHeight(), enhanced->GetWidth(), CV_8UC3, bmp_data.Scan0, std::abs(bmp_data.Stride)); // construct Map from Bitmap data. The problem is probably here

cvNamedWindow("w", 1);
cvShowImage("w", &imageMap); // runtime error (access violation)
cvWaitKey(0);

我有一个运行时错误,因为 imageMap 没有正确构建。我在这做错了什么?我将非常感谢您的解释。

1 个答案:

答案 0 :(得分:4)

如果您从Bitmap构建cv :: Mat,则必须使用

cv::imshow("w", imageMap);

画它。

再次,cv :: Mat的地址与cvShowImage()所需的IplImage *不同;

(顺便说一句,你也应该摆脱所有其他弃用的c-api电话。)

另外,要小心一点,按照你的方式构建一个Mat,有一个借用指向像素的指针。

我对gdi +一无所知,但如果指针超出范围或在调用enhanced-> UnlockRect(或称之为)时无效,则需要执行

Mat safeImg = imageMap.clone();

实现“深度”副本。