2014-07-09 4 views
0

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); 

내가 런타임 오류가, 이미지 맵 로 제대로 구성되지 않았습니다. 여기서 내가 뭘 잘못하고 있니? 나는 너의 설명에 대해 감사 할 것이다.

+4

예전의 c-api 함수를 피하십시오.'cv :: imshow ("w", imageMap)'대신 – berak

+0

'GetPixelFormat'에서 반환 된 픽셀 형식은 무엇입니까? @berak에게 – kobigurk

+0

: 문제였습니다! 대답 해주세요. 나는 그것을 받아 들일 것이다. –

답변

4

당신이 이력서를 건설하는 경우 : 매트를 비트 맵에서, 당신은 그것을 그릴

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

을 사용해야합니다.

다시 cv :: Mat의 주소는 cvShowImage()가 요구하는 IplImage *와 동일하지 않습니다.

을 (BTW, 당신이. 너무 다른 모든 사용되지 않는 C-API 호출을 없애한다) 조금 조심하는 매트는 가에 포인터를 빌려 가지고, 당신이 길을 건설 픽셀. 그 포인터가 범위를 벗어나거나 (이 호출이 있었는지 또는) 당신이이 고급를 호출 할 때> UnlockRect을 무효 얻는 경우에 +,하지만, 당신이 할 필요가

나는 GDI에 대해 아무것도 몰라

Mat safeImg = imageMap.clone(); 

'깊은'복사본을 얻을 수 있습니다.

관련 문제