繁体   English   中英

C++/CLI 将位图转换为 OpenCV Mat

[英]C++/CLI Convert Bitmap to OpenCV Mat

我正在尝试围绕 OpenCV 开发一个小型 C++/CLI 包装器,以便在 C# 应用程序中使用。 我不能使用 Emgu,因为它用于商业应用。

当我尝试从System.Drawing.Bitmap转换为OpenCV Mat时遇到问题。

我有以下代码:

cv::Mat BitmapToMat(System::Drawing::Bitmap^ bitmap)
{
    System::Drawing::Rectangle blank = System::Drawing::Rectangle(0, 0, bitmap->Width, bitmap->Height);
    System::Drawing::Imaging::BitmapData^ bmpdata = bitmap->LockBits(blank, System::Drawing::Imaging::ImageLockMode::ReadWrite, System::Drawing::Imaging::PixelFormat::Format24bppRgb);
    cv::Mat cv_img(cv::Size(bitmap->Width, bitmap->Height), CV_8UC3, bmpdata->Scan0.ToPointer(), cv::Mat::AUTO_STEP);
    bitmap->UnlockBits(bmpdata);

    return cv_img;
}

我在 cpp 文件中使用它来测试生成的 Mat 如下:

Mat image = BitmapToMat(templateImage);
cv::imwrite("some2.jpg", image);

但产生的图像完全失真(见图片)

输入位图图像

原图

结果垫图像保存到文件

结果图像

Windows 位图被填充。 您想计算位图行的“以字节为单位的宽度”,并提供它而不是cv::Mat::AUTO_STEP

int wb = ((bitmap->Width * 24 + 31) / 32) * 4;
cv::Mat cv_img(cv::Size(bitmap->Width, bitmap->Height), 
    CV_8UC3, bmpdata->Scan0.ToPointer(), wb);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM