image - 将 GDIPlus::Bitmap 转换为 cv::Mat(OpenCV C++ 接

我正在尝试将 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
);

Mat 构造函数的第一个参数是行,第二个是列。所以你应该这样做:
cv::Mat *retval = new cv::Mat(
    image.GetHeight(), image.GetWidth(), CV_8UC3
);

这可能会导致访问冲突。

编辑

此外,OpenCV 图像默认是 BGR,而不是 RGB。因此,如果你得到这个工作,然后用 imshow 显示图像,你的蓝色和红色值将向后。您可以调用 cv::cvtColor(retval, retval, CV_RGB2BGR) 来解决此问题。在您的退货声明之前。

关于image - 将 GDIPlus::Bitmap 转换为 cv::Mat(OpenCV C++ 接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099725/

相关文章:

visual-c++ - OpenCV Connected Component标签颜色?

opencv - 保存IPL_DEPTH_IMAGE供以后处理

opencv - 无法使用 OpenCV 从 FireWire cam 捕获图像

c# - 如何申请cvsobel + emgucv

android - 使用opencv在android中抓取连续帧

colors - 识别opencv中检测到的圆圈的颜色

opencv - cvSetErrMode 不工作

c# - EmguCV - 运动检测不返回角度

visual-studio-2010 - 我无法使用 VS2010 运行 openCV2.3.1

python-3.x - 队列的等价arg 'durable'