我正在尝试将 GDIPlus::Bitmap 转换为 openCV Mat 对象,但我遇到了访问冲突的问题,这意味着我没有做正确的事情,但我一遍又一遍地查看了代码,我认为它应该工作。
有没有人看到一个明显的问题?
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;
}
最佳答案
这是一个问题:
cv::Mat *retval = new cv::Mat(
image.GetWidth(), image.GetHeight(), CV_8UC3
);
cv::Mat *retval = new cv::Mat(
image.GetHeight(), image.GetWidth(), CV_8UC3
);
cv::cvtColor(retval, retval, CV_RGB2BGR)
来解决此问题。在您的退货声明之前。
关于image - 将 GDIPlus::Bitmap 转换为 cv::Mat(OpenCV C++ 接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099725/