首页 > 编程语言 >C#项目传递图像指针到C++项目,并转换成cv::Mat图像

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

时间:2024-10-11 19:46:21浏览次数:8  
标签:Mat C# dst namespace C++ int 图像 using include

一、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

相关文章

  • scheduler framework扩展点
    k8sv1.25.0扩展点作用queueSort待调度队列pod排序preFilter预选前预处理filter预选postFilter预选后处理(可修改pod为可调度)preScore预打分score优选reserve资源预留给podpermit阻止或延迟pod绑定......
  • scrapy框架学习笔记
    scrapy运行机制详见Architectureoverview安装直接pipinstallscrapy即可使用命令行scrapystartprojectname命令创建一个新的Scrapy项目scrapycrawlSpiderName命令运行爬虫scrapyrunspiderSpiderName命令运行脚本。更多命令直接查Commandlinetool概述编写S......
  • MacOS在VS code上运行Python失败,通过更改pythonPath解决
    问题描述安装完成python后,默认的运行python命令是python3,而VSCode上默认命令是python解决办法在file\preference\settings下(或使用快捷键Ctrl+,),搜索python.pythonPath然后点击AddItem,加入"python.pythonPath"="python3"再修改一下调试结束之后保存,重启VSCode......
  • C++(继承)
    1.继承1.1基础使用继承就是在一个已经存在的类的基础上新建立一个类,新创建的类拥有之前类的特性。继承是面向对象的三大特性之一,体现了代码复用的思想。已经存在的类被称为“基类BaseClass”或“父类”新创建的类被称为“派生类”或“子类SubClass”下面是一个最简......
  • 2024西北工业大学noj(C语言)记录
    作者是零基础捏,仅作个人学习记录,多数题目会有更优解。有些题目虽然AC了但是可能不严谨。有错误请务必指正我我做完之后会看去年学长发的贴子,各位可以直接看他们的,他们的算法确实更优,有些打的注解就是看过他们的文章后加入的。如果各位有优解可以在评论区或者私信教我hh......
  • echarts使用【示例】
    下载npminstallecharts示例<template><divid="main"style="width:600px;height:400px;"></div></template><scriptsetup>import{onMounted}from'vue';import*asechartsfrom'echart......
  • Cinema 4D最新2025版安装包教程百度云下载
    如大家所熟悉的,Cinema4D常常被简称为C4D,它是一款深受使用者和用户喜爱的3D建模、动画和渲染软件,广泛应用于影视、动画、科学、建筑等领域。目前最新为C4D2025版本。高效的建模系统C4D的建模系统高效且强大,支持多边形建模、细分曲面等多种建模方式,可创建复杂的几何体和表面......
  • CentOS系统安全配置
    一、账户安全及权限禁用root以外的超级用户禁用root以外的超级用户1.检测方法:点击查看代码cat/etc/passwd查看口令文件,文件格式如下login_name:password:user_ID:group_ID:comment:home_dir:command若user_ID=0,则该用户拥有超级用户的权限。查看此处是否有多个ID=02.检测命......
  • CSS居中方法总结
    一、行内元素(1)水平居中  1.通过text-align:center<divclass="parent"><spanclass="child">我是行内元素</span></div>.parent{background-color:red;text-align:center;} 2.通过fit-content给父元素的宽度加上width:fit-cont......
  • 基于最小二乘递推算法的系统参数辨识matlab仿真
    1.程序功能描述基于最小二乘递推算法的系统参数辨识。对系统的参数a1,b1,a2,b2分别进行估计,计算估计误差以及估计收敛曲线,然后对比不同信噪比下的估计误差。2.测试软件版本以及运行结果展示MATLAB2022a版本运行  3.核心程序fori=(LEN0+4):LENz(i,1)=-A1*z(i-1......