C#项目传递图像指针到C++项目,并转换成cv::Mat图像

一、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());

 

posted @   金灿灿  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示