感谢网友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);

参考

c#与 c++dll互传图片
c#和c++相互传递图片数据

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐