System :: Drawing :: Bitmap to cv :: Mat(OpenCV c ++ / cli)

时间:2015-03-12 19:18:13

标签: .net opencv visual-c++ bitmap c++-cli

我试图将System :: Drawing :: Bitmap转换为cv :: Mat,最终将成为c#的包装器(在这种情况下不能使用EMGU)。我已经看过很多关于如何使用指向Bitmap数据的指针来构造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的图像观看插件来检查我的图像,如果我直接从文件中加载cv :: Mat就可以了。

1 个答案:

答案 0 :(得分:1)

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

 ::Bitmap myclone

而不是

::Bitmap ^myclone

我这样做是为了避免我遇到的内存错误。从那时起,我已经设置了项目,因此我可以调试本机代码并查看正在进行的操作。我好像已经摆脱了内存错误并使用了我原来的Bitmap对象而不是克隆。它似乎现在正在运作。为了制作我的cv :: Mat的深层副本,我也克隆了它。我这样做是因为它没有指向托管堆上的原始位图。我不知道这是否有必要,但现在似乎有效。