gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:01:41 30 4
gpt4 key购买 nike

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

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

输入位图图像

ORIGINAL IMAGE

结果垫图像保存到文件

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

关于C++/CLI 将位图转换为 OpenCV Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59421739/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com