我需要将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 没有正确构建。我在这做错了什么?我将非常感谢您的解释。
答案 0 :(得分:4)
如果您从Bitmap构建cv :: Mat,则必须使用
cv::imshow("w", imageMap);
画它。
再次,cv :: Mat的地址与cvShowImage()所需的IplImage *不同;
(顺便说一句,你也应该摆脱所有其他弃用的c-api电话。)
另外,要小心一点,按照你的方式构建一个Mat,有一个借用指向像素的指针。
我对gdi +一无所知,但如果指针超出范围或在调用enhanced-> UnlockRect(或称之为)时无效,则需要执行
Mat safeImg = imageMap.clone();
实现“深度”副本。