一、首先是C++端:
1.1 Mat类型
注意:mat 或者 copy_mat需要在.h文件中定义
1.1.1 本地静态图片
Mat mat = cv::imread("your path\\photo name.jpg");
1.1.2 设备相机图像
VideoCapture vid_cap;
vid_cap.open(0或1或2等);//相机标号
cv::Mat mat;
vid_cap.read(mat);
1.1.3 复制正在处理的图像
mat 可在DLL做其他处理
VideoCapture vid_cap;
vid_cap.open(0或1或2等);//相机标号
cv::Mat mat;
vid_cap.read(mat);//mat 在DLL做其他处理
//然后复制mat, 以下三种方法都行
Mat copy_mat = cv::Mat(1920,1080, CV_8UC3);//指定copy_mat 大小,与mat一致
mat.copyTo(copy_mat);//可以
copy_mat= mat;//可以
copy_mat= mat.clone();//可以
二、传参
2.1 .h文件引入头文件
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
#include <opencv2/aruco.hpp>
#include <Eigen/Geometry>
#include <Eigen/SVD>
#include <Eigen/Core>
2.2 .h文件定义
extern "C" __declspec(dllexport) void return_Image(unsigned char** imageDataPtr, int* imageSizePtr);
2.3.cpp文件添加函数
void return_Image(unsigned char** imageDataPtr, int* imageSizePtr) // 不成功, 可以选择尝试 TCP 传输
{
Mat read_photo = mat或者copy_mat;
std::vector<uchar> pushback_Imagedata;
cv::imencode(".bmp", read_photo, pushback_Imagedata);
// 分配内存并将图像数据复制到内存中
*imageDataPtr = new unsigned char[pushback_Imagedata.size()];
memcpy(*imageDataPtr, pushback_Imagedata.data(), pushback_Imagedata.size());
// 设置图像数据的大小
*imageSizePtr = pushback_Imagedata.size();
}
然后生成DLL,我命名为了DOT_Tracker.dll
三、C#中调用
using System.Runtime.InteropServices;
public class dllImport
{
[DllImport("DOT_Tracker.dll", EntryPoint = "return_Image")]
public static extern void return_Image(out IntPtr imageDataPtr, out int imageSize);
}
while(true)
{
IntPtr imageDataPtr;
int imageSize;
dllImport.return_Image(out imageDataPtr, out imageSize);
// 将字节数组转换为 byte[]
byte[] imageData = new byte[imageSize];
Marshal.Copy(imageDataPtr, imageData, 0, imageSize);
// 创建 OpenCV 的 Mat 对象
Mat image = new Mat();
image = Cv2.ImDecode(imageData, ImreadModes.Color);
Cv2.Resize(image, image, new OpenCvSharp.Size(720, 405));
Cv2.ImShow("left_new", image);
// 清理内存
Marshal.FreeCoTaskMem(imageDataPtr);
}
亲测都是没问题的
Attention: 有一个问题是,如果你在C++中使用了cv::imshow(" “, mat)或者cv::imshow(” ", copy_mat),在C#端显示的将是一张灰色图片,所以C++向外传输图像的时候不要在C++端imshow()