C ++ DLL将Mat返回给C#

时间:2012-07-23 14:37:03

标签: c# c++ opencv

我在C ++中有一个DLL构建,并将返回Mat对象。 该图片信息为384 * 384 * 24颜色。

C#代码

Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format24bppRgb, test1());
pictureBox0.Image = a;

C ++代码

uchar*  DLL_EXPORT test1(void)
{
    Mat OriginalImg = imread("c:\\20100812133.jpg", 1 );

    return OriginalImg.data;
}

代码还可以,但我想以灰色阅读图片。 我会做一些图像处理(例如:Threshod),并转换为颜色, 并返回C#并显示它!

C ++代码

uchar*  DLL_EXPORT test0(void)
{
    Mat OriginalImg = imread("c:\\20100812133.jpg", 0 );
    threshold(OriginalImg,OriginalImg,0,255,THRESH_OTSU);
    cvtColor(OriginalImg,OriginalImg,CV_GRAY2BGR);
    return OriginalImg.data;
}

c ++代码失败了,你能帮忙吗?


UPDATA http://ppt.cc/h2SI图片失败,我认为原因是记忆。 我将c#代码修改为第3个parmet 3 * 384到2 * 384。 C#运行正常,但图片像http://ppt.cc/IRfd

一样中断

- UPDATA

Bitmap a = new Bitmap(384, 384, 1 * 384, PixelFormat.Format24bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 2 * 384, PixelFormat.Format24bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format24bppRgb, test0());

Bitmap a = new Bitmap(384, 384, 2 * 384, PixelFormat.Format32bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format32bppRgb, test0());
Bitmap a = new Bitmap(384, 384, 4 * 384, PixelFormat.Format32bppRgb, test0());

我尝试了六次,跑步还可以,但照片是休息的。

3 个答案:

答案 0 :(得分:1)

您将返回一个指向已经被释放的局部变量的指针,该变量永远不可靠。

您需要安排Mat对象活得足够长,以便Bitmap构造函数复制其内容。最简单的方法是使用C ++ / CLI,然后您可以从C ++返回.NET Bitmap:

Bitmap^ MyImageProcessor::test0(void)
{
    Mat OriginalImg = imread("c:\\20100812133.jpg", 0 );
    threshold(OriginalImg,OriginalImg,0,255,THRESH_OTSU);
    cvtColor(OriginalImg,OriginalImg,CV_GRAY2BGR);
    return gcnew Bitmap(384,
                        384,
                        3 * 384,
                        PixelFormat.Format24bppRgb,
                        IntPtr(OriginalImg.data)
                       );
}

答案 1 :(得分:0)

你检查了imread的成功吗?

Mat OriginalImg = imread("c:\\20100812133.jpg", 0 );
if(OriginalImg.empty())
    return NULL;

在C#中(注意我写的代码不一定正确,但你明白了)

char* imgData = test1;

if(imgData == Null)
{
 // do something smart
}

Bitmap a = new Bitmap(384, 384, 3 * 384, PixelFormat.Format24bppRgb, imgData);
pictureBox0.Image = a;

这是你在编程中可以做的最常见的错误之一 - 也是最烦人的错误之一

答案 2 :(得分:0)

另一个选项:您可以使用C#包装器库,以便直接从托管代码联系DLL。

http://code.google.com/p/opencvdotnet/