当前位置: 首页>移动开发>正文

c++ dll 与c#数据通信(直接传Mat)

c++ 动态库部分

.h 文件

//函数声明

#define DLL_API extern "C" _declspec(dllexport)

DLL_API int  _stdcall Image_thresh(Mat& InImage, Mat& OutImage);

.cpp 文件

int  _stdcall Image_thresh(Mat& InImage, Mat& OutImage)

{

	threshold(InImage, OutImage, 50, 255, 1);

	return 0;

}

c# 部分

				[DllImport("xxxxxx.dll", CallingConvention = CallingConvention.Cdecl)]

        private extern static int Image_thresh(IntPtr InImage, IntPtr OutImage);

        private void button1_Click(object sender, EventArgs e)

        {

            //拿到输入图和指针

            Mat InImage = Cv2.ImRead(@"D:.jpg");

            Cv2.CvtColor(InImage, InImage,ColorConversionCodes.RGB2GRAY);

            //定义个变量

            Mat OutImage = new Mat();


            //调用 Dll函数

            Image_thresh(InImage.CvPtr, OutImage.CvPtr);

            //Mat图片 转 pictureBox1

            pictureBox1.Image = new Bitmap(OutImage.ToMemoryStream()) as Image;


        }

c# opencvsharp 下载位置

在项目引用中管理程序包中搜索下载

c++ dll 与c#数据通信(直接传Mat),c++ dll 与c#数据通信(直接传Mat)_Mat数据通信,第1张

OpenCvSharp 在实现时,是通过对C++中的OpenCV进行了进一步封装,将Mat数据定义成指针类型,然后以指针的方式在C++与C#中进行传递;而在C#中,重新定义了Mat数据类型,将C++传递来的Mat指针作为成员变量进行初始化,而后续基于Mat的所有操作,其低层都是通过传递这个指针进行操作的。

c++ dll 与c#数据通信(直接传Mat),c++ dll 与c#数据通信(直接传Mat)_Mat数据通信_02,第2张

  知道了Mat的这个数据类型的实现原理后,我们可以模仿这种方式,以指针的方式实现将OpenCvSharp的数据传递到OpenCV C++中,这样就可以快速实现数据类型传递。实现方式如下图所示。

c++ dll 与c#数据通信(直接传Mat),c++ dll 与c#数据通信(直接传Mat)_Mat数据通信_03,第3张

  在C#中使用OpenCvSharp获取一个图片数据,数据类型为Mat,我们可以先进行处理等操作;接下来我们可以获取OpenCvSharp的地址CvPtr,然后在C++中使用*Mat指针进行获取,然后通过*Mat我们便可以获取到OpenCV C++中的Mat数据。接下来,用户就可以根据自己的需求进行处理即可。在处理完成后,在将获得新的用Mat数据转为用*Mat指针,然后再C#中,使用IntPtr数据类型进行接收,然后使用OpenCvSharp的Mat以获取的指针数据为初始值初始化Mat数据类型即获得新的Mat数据。


https://www.xamrdz.com/mobile/4bp1963748.html

相关文章: