一、C#传递指针地址到C++项目
1、C++代码。新建C++/CLR .NetFramewrok4.8项目
.h文件
#pragma once
#include <opencv2/opencv.hpp>
extern "C" __declspec(dllexport) int CropImage(cv::Mat & image, int h, int w);
.cpp文件
int CropImage(cv::Mat& image, int h, int w) { //cv::Mat img_from_buffer = cv::Mat(h, w, CV_8UC3, ptr); cv::imwrite("D:\\112.png", image); return 1; }
2、C#代码。新建.NetFramework4.8窗体应用或控制台应用
先引用C++项目的dll文件,ConsoleApplication1.dll指的是C++项目生成的dll文件。每次更新C++代码需要重新生成dll文件才会更新引用的dll
// 此代码写到调用类的全局位置
[DllImport("ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int CropImage(IntPtr image, int h, int w);
// 此处使用的是OpenCvSharp库,Nuget包可搜索安装。此C#代码使用的是.NetFramework4.8框架,所以OpenCvSharp可以安装最新稳定版本
OpenCvSharp.Mat dst= OpenCvSharp.Cv2.ImRead("D:\\1.png", OpenCvSharp.ImreadModes.Unchanged);
CropImage(dst.CvPtr, dst.Rows, dst.Cols);
二、C#传递指针地址值到C++项目
注意,指针地址和指针地址值不是同一个东西。有些C++项目生成.exe文件,C#项目只能传入字符串到改exe文件。
1、C++代码。同样新建C++/CLR .NetFramewrok4.8项目
.h文件
#pragma once namespace AlgDll { public ref class AlgCommon2 { private: public: int CropImage(System::String^ cstr, int h, int w, int channels, int elemSize); }; }
.cpp文件
#include "pch.h" #include "AlgCommon2.h" #include <opencv2/opencv.hpp> #include <opencv2/core/core_c.h> #include <msclr/marshal_cppstd.h> #include <string> #include <msclr/marshal_cppstd.h> using namespace std; using namespace cv; using namespace System::Collections::Generic; using namespace System::Runtime::InteropServices; using namespace System; using namespace System::Data; using namespace System::IO; using namespace System::Collections; using namespace msclr::interop; int AlgDll::AlgCommon2::CropImage(System::String^ ptr, int h, int w, int channels, int elemSize) { std::string str = marshal_as<std::string>(ptr); //std::cout << str << std::endl; long long num = std::stoll(str); //std::cout << "转换后的数字为: " << num << std::endl; System::IntPtr myIntPtr = System::IntPtr(num); cv::Mat mat(h, w, CV_8UC3, (uchar*)myIntPtr.ToPointer(), 0); cv::imwrite("D:\\112.png", mat); return 1; }
2、C#代码
此处同样要手动引用C++项目生成的dll文件。
OpenCvSharp.Mat dst= OpenCvSharp.Cv2.ImRead("D:\\1.png", OpenCvSharp.ImreadModes.Unchanged);
AlgDll.AlgCommon2 algCommon = new AlgDll.AlgCommon2();
// 注意此处传递的是数据的指针地址,而不是OpenCV结构的原生指针
algCommon.CropImage(dst.Data.ToString(), dst.Rows, dst.Cols, dst.Channels(), dst.ElemSize());
标签:Mat,C#,dst,namespace,C++,int,图像,using,include From: https://www.cnblogs.com/resplendent/p/18459098