我需要将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的构造不正确。我在这里做错了什么?谢谢您的解释。

最佳答案

如果要从位图构造cv::Mat,则必须使用

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

画出来。

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

(顺便说一句,您也应该摆脱所有其他不推荐使用的c-api调用。)

同样,要小心一点,按照您的方式构造的Mat具有借用的像素指针。

我对gdi +一无所知,但是如果当您调用Enhanced-> UnlockRect(或它的名称)时该指针超出范围或变得无效,则需要做
Mat safeImg = imageMap.clone();

实现“深层”复制。

07-27 19:02