我在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());
我尝试了六次,跑步还可以,但照片是休息的。
答案 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。