Мне нужно конвертировать 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 не совпадает с IplImage *, который требуется cvShowImage ();
(Кстати, вы должны избавиться от всех других устаревших вызовов c-api.)
также, будьте немного осторожнее, мат, сконструированный так, как вы делаете, имеет заимствованные указатель на пиксели.
я ничего не знаю о gdi +, но если этот указатель выходит из области видимости или становится недействительным, когда вы вызываете extended-> UnlockRect (или как он был вызван), вам нужно будет сделать
Mat safeImg = imageMap.clone();
добиться «глубокой» копии.