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:\1.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 下载位置
在项目引用中管理程序包中搜索下载
OpenCvSharp 在实现时,是通过对C++中的OpenCV进行了进一步封装,将Mat数据定义成指针类型,然后以指针的方式在C++与C#中进行传递;而在C#中,重新定义了Mat数据类型,将C++传递来的Mat指针作为成员变量进行初始化,而后续基于Mat的所有操作,其低层都是通过传递这个指针进行操作的。
知道了Mat的这个数据类型的实现原理后,我们可以模仿这种方式,以指针的方式实现将OpenCvSharp的数据传递到OpenCV C++中,这样就可以快速实现数据类型传递。实现方式如下图所示。
在C#中使用OpenCvSharp获取一个图片数据,数据类型为Mat,我们可以先进行处理等操作;接下来我们可以获取OpenCvSharp的地址CvPtr
,然后在C++中使用*Mat
指针进行获取,然后通过*Mat
我们便可以获取到OpenCV C++中的Mat数据。接下来,用户就可以根据自己的需求进行处理即可。在处理完成后,在将获得新的用Mat
数据转为用*Mat
指针,然后再C#中,使用IntPtr
数据类型进行接收,然后使用OpenCvSharp的Mat以获取的指针数据为初始值初始化Mat
数据类型即获得新的Mat
数据。