我需要将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();
实现“深层”复制。