C++ 将位图转换为Mat
我需要将Gdiplus::Bitmap转换为cv::Map格式。 我正在使用此代码执行此操作: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* 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:这就是问题所在!请回答一下。我会接受的。