C++ 将位图转换为Mat

C++ 将位图转换为Mat,c++,opencv,bitmap,bitmapdata,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:

我需要将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调用。)

另外,请注意,按照您的方式构造的垫子有一个借用的指向像素的指针

我对gdi+一无所知,但如果当您调用enhanced->UnlockRect(或它的名称)时,该指针超出范围或无效,您将需要执行以下操作

Mat safeImg = imageMap.clone();

要实现“深度”复制。

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

cv::imshow("w", imageMap);
画出来

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

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

另外,请注意,按照您的方式构造的垫子有一个借用的指向像素的指针

我对gdi+一无所知,但如果当您调用enhanced->UnlockRect(或它的名称)时,该指针超出范围或无效,您将需要执行以下操作

Mat safeImg = imageMap.clone();

要实现“深度”复制。

请避免使用旧的c-api函数,请使用:
cv::imshow(“w”,imageMap)
而不是从
GetPixelFormat
返回到@berak的像素格式是什么?这就是问题所在!请回答一下。请避免使用旧的c-api函数,使用:
cv::imshow(“w”,imageMap)
而不是从
GetPixelFormat
返回的像素格式是什么?到@berak:这就是问题所在!请回答一下。我会接受的。