c#与c++通过DLL互传图片数据
·
感谢网友Zhao-Michael代码贡献。
参考示例
1. C# Pass Image Data to C++ :
在C++定义DetectImage函数作为接收图片数据的处理
Mat img;
IMGAPI DetectImage(int* image, int wid, int hei, int step)
{
Mat img(Size(wid, hei), CV_8UC1, image, step);
imshow("", img);
return 0;
}
C#调用之前要引用C++项目生成的DLL
[DllImport(DllName, EntryPoint = "DetectImage")]
public static extern int DetectImage(IntPtr Image, int wid, int hei, int step); //Dll Invoke 函数签名
使用方法一
Image<Gray, byte> im = new Image<Gray, byte>("D:/taylorswift.jpg");
IntPtr im_ptr = new IntPtr();
int step = 0;
Size size = new Size();
CvInvoke.cvGetRawData(im, out im_ptr, out step, out size); //这边的 Step 是大于Width的最小的 4 的整数倍的值
DllHandler.DetectImage(im_ptr, size.Width, size.Height, step);
使用方法二
Image<Gray, byte> im = new Image<Gray, byte>("D:/taylorswift.jpg");
var b_src = im.Bytes;
var len = b_src.Length;
IntPtr im_ptr = Marshal.AllocHGlobal(len);
Marshal.Copy(b_src, 0, im_ptr, len);
DllHandler.DetectImage(im_ptr, im.Width, im.Height, (im.Width / 4 + 1) * 4);
2. C++ Pass Image Data to C# :
C++
Mat img;
IMGAPI DetectImage(int & ptr, int & wid, int & hei)
{
img = imread("D:/taylorswift.jpg", 0);
ptr = (int)img.data;
wid = img.cols;
hei = img.rows;
return 0;
}
C#
[DllImport(DllName, EntryPoint = "DetectImage")]
public static extern int DetectImage(out IntPtr Image, out int wid, out int hei);
//使用
int step = 0;
int wid = 0;
int hei = 0;
IntPtr im_ptr = new IntPtr();
DllHandler.DetectImage(out im_ptr, out wid, out hei);
var im = new Image<Gray, byte>(wid, hei);
CvInvoke.cvSetData(im, im_ptr, wid);
ShowCVImage(im);
参考
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)