2

我有一个用 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++代码失败,你能帮忙吗?


更新 数据http://ppt.cc/h2SI图片失败,我认为原因是内存。我将 c# 代码将第三个参数 3*384 修复为 2*384。C# 运行正常,但图片像这样中断http://ppt.cc/IRfd

-- 更新数据

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

我试了六次,跑步还可以,但是画面坏了。

4

2 回答 2

1

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

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

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)
                       );
}
于 2012-07-23T16:36:02.180 回答
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;

这是您在编程中最常犯的错误之一 - 也是最烦人的错误之一

于 2012-07-23T14:47:38.810 回答