Преобразовать растровое изображение в мат

Мне нужно конвертировать 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

Решение

если вы создаете cv :: Mat из своего растрового изображения, вам придется использовать

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

нарисовать это.

опять же, адрес cv :: Mat не совпадает с IplImage *, который требуется cvShowImage ();

(Кстати, вы должны избавиться от всех других устаревших вызовов c-api.)

также, будьте немного осторожнее, мат, сконструированный так, как вы делаете, имеет заимствованные указатель на пиксели.

я ничего не знаю о gdi +, но если этот указатель выходит из области видимости или становится недействительным, когда вы вызываете extended-> UnlockRect (или как он был вызван), вам нужно будет сделать

Mat safeImg = imageMap.clone();

добиться «глубокой» копии.

4

Другие решения