gpt4 book ai didi

.net - System::Drawing::Bitmap 到 cv::Mat (OpenCV c++/cli)

转载 作者:太空宇宙 更新时间:2023-11-03 21:45:52 24 4
gpt4 key购买 nike

我正在尝试将 System::Drawing::Bitmap 转换为 cv::Mat,最终成为 c# 的包装器(在这种情况下不能使用 EMGU)。我看过很多关于如何使用指向位图数据的指针构建 cv::Mat 的示例,但我的 cv 图像是垃圾(几个像素的垃圾然后什么都没有)。

我的代码是:

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

我尝试了各种方法并尝试直接复制字节,但似乎无法正确获取语法。但是,无论我做什么,图像似乎都无法正确转换。我正在使用 visual studio 的 image watch 插件来检查我的图像,如果我直接从文件加载 cv::Mat 就没问题。

最佳答案

我发现了问题。在我的代码的前面,我克隆了位图,但没有创建指向克隆的指针。即

 ::Bitmap myclone

而不是

::Bitmap ^myclone

我这样做是为了尝试避免出现内存错误。从那时起,我就设置了项目,这样我就可以调试 native 代码并查看发生了什么。我似乎已经摆脱了内存错误并使用了我的原始 Bitmap 对象而不是克隆。它现在似乎正在工作。为了制作我的 cv::Mat 的深拷贝,我还克隆了它。我这样做是为了让它不指向我在托管堆上的原始位图。我不知道这是否有必要,但目前看来它是有效的。

关于.net - System::Drawing::Bitmap 到 cv::Mat (OpenCV c++/cli),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29018442/

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