我試圖將GDIPlus :: Bitmap轉換爲openCV Mat對象,但是我遇到了訪問衝突問題,這意味着我'我沒有做正確的事情,但我一遍又一遍地查看了代碼,我認爲它應該可以工作。將GDIPlus :: Bitmap轉換爲cv :: Mat(OpenCV C++接口)
有沒有人看到一個明顯的問題?
cv::Mat ConvertToOpenCV(Gdiplus::Bitmap &image) {
cv::Mat *retval = new cv::Mat(
image.GetWidth(), image.GetHeight(), CV_8UC3
);
Gdiplus::BitmapData source;
Gdiplus::Rect rect(0, 0, image.GetWidth(), image.GetHeight());
Gdiplus::Status status =
image.LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &source);
if (status != Gdiplus::Ok) {
// Some error condition
return retval; // No image copied
}
BYTE *destination = (BYTE *)retval->data;
for (int y = 0; y != source.Height; ++y) {
BYTE *src = (BYTE *) source.Scan0 + y * source.Stride;
BYTE *dst = (BYTE *)(destination + y * retval->step);
memcpy(dst, src, 3 * source.Width); // Access Violation happens here
}
image.UnlockBits(&source);
return retval;
}
Doh!非常感謝您的關注,我甚至都沒有想過看看!這是一個很好的測試用例,我需要添加到我的單元測試中。我相信我所有的測試圖像都是正方形的,這會隱藏這種行爲! 顏色順序對我來說並不重要,因爲我正在轉換爲灰度並對圖像進行區分,所以我沒有打擾它。 非常感謝您抓住我愚蠢的錯誤! – RussTheAerialist
我一定找到了它,因爲我很習慣在自己的代碼中找到類似的東西!當我使用MAX()時,我無法告訴你我使用了MIN()多少次。 :-) – SSteve