【问题标题】:Convert Bitmap to Mat将位图转换为 Mat
【发布时间】:2014-07-09 13:47:13
【问题描述】:

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

【问题讨论】:

  • 请避免使用旧的 c-api 函数,改用:cv::imshow("w", imageMap)
  • GetPixelFormat返回的像素格式是什么?
  • 致@berak:这是问题所在!请把它放在一个答案中。我会接受的。

标签: c++ opencv bitmap bitmapdata


【解决方案1】:

如果你从你的位图构造一个 cv::Mat,你将不得不使用

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

画出来。

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

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

另外,请注意一点,按照您的方式构建的 Mat 有一个 借来的指向像素的指针。

我对gdi+一无所知,但是如果当你调用enhanced->UnlockRect(或它被调用的)时那个指针超出范围或变得无效,你将需要做

Mat safeImg = imageMap.clone();

实现“深度”复制。

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多