c++ - C++/CLI 将位图转换为 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);
但是产生的图像完全失真(见图)
输入位图图像
结果 MAT 图像保存到文件
解决方案
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);
推荐阅读
- typescript - Travis CI 构建过程 - TypeScript 在 Mocha 之前捕获错误
- typo3 - 如果没有结果,则 TypoScript 内容使用另一个查询
- c# - 使用从 Azure AD 组中检索电子邮件 ID
- c++ - 虚幻 4.24.3:如何在 .cpp 文件中声明 UPROPERTY()
- html - CSS Grid 布局 IE11 不考虑尺寸
- javascript - 使用来自 MSSQL 和 node.js 网络服务器的实时数据可视化图表
- scala - 为什么 spark (scala API) agg 函数需要 expr 和 exprs 参数?
- vuex - Nuxt 在插槽中使用组件,vuex 存储未定义
- junit5 - 断言数组中的值,数组没有名称
- assembly - 在程序集中读取命令行参数