自制OpenCV的C++ dll文件,C#调用OpenCV函数

vs2019 + opencv生成自己的dll动态库供他人使用 小结一下:生成动态库的目的主要是让自己写的工程代码便于给其他部门或公司用,但自己写的代码使用了第三方库opencv、eigen3、arma等,因此这个前提是他人的电脑也配置好了同样的库才能使用我们生成的动态库。如下图,建立后vs2019默认有这4个文件,有方法是在那几个.h和.cpp中直接粘贴代码的,但这样的话在使用生成的dll时得#include"pch.h",这样在多个dll工程中都会有"pch.h",造成不知道是哪个头文件,因此这里直接忽略他们。这个目录就是math工程中的.h和.cpp文件路径。 阅读详情

因为实验室统一用C#,最近一直在思考如何将写好的C++代码转化为C#。

众所周知,OpenCV是一个图形图像处理方面的库,里边封装了许多针对C、C++有用的函数。有时候用C++实现了某些功能,但C#不能直接调用OpenCV,因此两种语言不能直接混合编程。要实现C#调用OpenCV函数,可以将本机C++代码(指非托管C++)编译成一个dll,供C#调用。调用方法为 [DllImport(×××.dll)] 。(还有其他的方法,大家可以通过某度搜索)

下面详细演示一下这种方法实现的过程。

运行环境:VS2013+OpenCV3.0

第一步:将C++代码编译成一个dll文件

(1)打开VS2013,新建一个Visual C++空项目,文件名称和位置可以自己修改。

(2)在解决方案资源管理器中新建一个头文件(.h)。

(3)在新建的头文件中,输入以下内容

extern "C" __declspec(dllexport) void AutoFocus();

extern "C"外部声明,表示函数和变量是按照C语言的方式编译和链接的。

_decspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern "C" _declspec(dllexport)的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做的DLL。

(4)在源文件文件夹下新建C++文件(.cpp)

(5)在新建的demo.cpp中输入代码

#include <opencv2/opencv.hpp>    
#include <iostream>
#include "opencv2/core/core.hpp"
#include <opencv2/imgproc/imgproc.hpp>  
#include "opencv2/highgui/highgui.hpp"
#include <cv.h> 
#include"demo.h"   //这里对应你新建的那个头文件

using namespace std;
using namespace cv;

void AutoFocus()
{
	string pattern = "D:/皮卡丘最可爱/*.jpg";  //test的图片放在D盘
	vector<Mat> images;
	vector<String> pic;  // 必须cv的String
	glob(pattern, pic, false);
	size_t count = pic.size();
	cout << count << endl;  //显示一共有多少张图片
	for (int i = 0; i < count; i++)
	{
		images.push_back(imread(pic[i]));
		Mat imageSource = images[i];
		Mat imageGrey;
		cvtColor(imageSource, imageGrey, COLOR_RGB2GRAY);

		Mat imageSobel;
		Laplacian(imageGrey, imageSobel, CV_16U);  //Laplacian梯度法,数值越大表示图像越清晰

		double meanValue = 0.0;
		meanValue = mean(imageSobel)[0];   //图片清晰度

		//double to string  
		stringstream meanValueStream;
		string meanValueString;            //字符串
		meanValueStream << meanValue;
		meanValueStream >> meanValueString;
		meanValueString = "Articulation(Laplacian Method): " + meanValueString;
		putText(imageSource, meanValueString, Point(20, 20), FONT_HERSHEY_COMPLEX, 0.7, Scalar(255, 0, 0), 2);
		imshow("Articulation", imageSource);
		waitKey(1000);
		cout << meanValue << endl;  //显示图片的清晰度

		//将清晰度数据存为xml文件
		FileStorage mul_wr("D:\\pikaqiu.xml", FileStorage::APPEND);
		mul_wr << "meanValue" << meanValue;
		mul_wr.release();
	}
}

出现红色波浪线是因为没有添加OpenCV配置文件,加上即可。

(配置方法可参考:https://blog.youkuaiyun.com/poem_qianmo/article/details/19809337)

(6)在源文件文件夹下新建模块定义文件(.def)

(7)模块定义文件demo.def里内容如下:

代码:

LIBRARY demo 
EXPORTS AutoFocus 

EXPORTS后面的就是你要调用的方法名,生成.dll文件的同时也会生成.lib库。

(8)重新生成解决方案,可能会出现以下错误:

这是运行库设置的问题,几个工程的运行库设置不一样。解决方法:

【项目属性】→ 【配置属性】→ 【C/C++ 】→ 【代码生成】→ 【运行库】→ 【多线程调试(/MTd)】

再重新生成解决方案。 

(9)再重新生成整个解决方案,可能又会出现以下错误:

这是因为输出文件拓展名的问题,解决方法如下:

【项目属性】→ 【配置属性】→【常规】→【目标文件扩展名】,将.exe,改为.dll

这时再重新生成解决方案就可以啦~

(10)找到解决方案所在目录,在Debug目录下即可找到生成的 .dll 文件。要注意的是,要到整个解决方案的目录下找Debug文件夹,如下图

第二步:C#调用dll文件

(1)新建一个C#项目。(把装有照片的文件夹放在D盘,并命名为“皮卡丘最可爱”。ps:照片在博文最后)

(2)把demo.dll文件复制到该工程的Debug目录下。 

(3)在C#文件中引用该 .dll 文件,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;   //新增
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        [DllImport("demo.dll")]    //新增
        private extern static void AutoFocus();  //新增
        static void Main(string[] args)
        {
            Console.WriteLine("C#调用dll");
            AutoFocus();
            Console.Read();
        }
    }
}

(4)点击运行,大功告成啦!!!

 

 

 

 

 

PS:“皮卡丘最可爱”图片,4张图片清晰度不同。

opencv + DLL 文章目录VS2017 + opencv(345) + C++创建和使用DLL创建DLL调用DLL VS2017 + opencv(345) + C++创建和使用DLL 前提:环境已经配置好 创建DLL 1.新建项目,选择DLL,名称位置自定,如图所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3slRgbN-1604627418769)(https://i.loli.net/2020/11/05/zqeADw5mN98EWG3.png)] 2.如图自动生成头文件fra 阅读详情

相关推荐

opencv及其在c#中调用

1 opencv简介 OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效—由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的诸多通用算法。 2 openc...

kevinshift的博客 7523

vs2017+opencv编写的代码生成dll给另一个工程使用

将使用含有第三方库的函数封装成dll文件供别的工程调用,主要有两种方法: 使用类进行打包dll:VS2013生成Dll,在另一工程中调用dll(C++Win32)_slm1130的博客-优快云博客 使用函数进行打包dll 这里主要分析使用函数进行打包dll。 一:生成dll 1、新建项目:新建 -------》项目 -------》windows桌面 -------》动态链接库(dll) 建好工程后会发现工程目录下只有一个文件: 2、创建一个头文件存放实现函数的声明: 新建.....

weixin_42408280的博客 5845

opencv c++生成dll,供c#调用

如果dll导出没有函数,C# 调用DLL报无法在DLL "xxxx.dll"中找到名为“xxxx”的入口点错误。1.确保 C++ 项目和 C# 项目都在相同的平台上编译,例如都是 x64 或都是 x86。如果 C++ 项目是以 x64 模式编译的,则确保 C# 项目也是以 x64 模式编译的。本文使用opencv455来实现切图功能的实现,通过c++生成dll,c#中调用。2.确保都是c++是debug,c#也是debug,同理release也要一致。参考下面文章,主要是添加模块定义文件!

Mapalas的博客 1241

封装opencv的函数成dll,独立调用

在opencv的实际使用,经常遇到这种情况,自己在电脑上配置了opencv,写好了opencv的代码工程,在环境变量中加了opencv的dll的路径,这样可以在自己电脑上运行代码。但是如果将该工程拷贝到其他没有配置opencv的电脑上就无法运行。解决办法:在配置了opencv的电脑上(但是在环境变量中没有添加dll的路径),将调用相关函数的代码封装成函数,生成dll文件,拷贝到其他没配置opencv

JoliceYu的技术博客 1万+

C#调用C++编写的OpenCV图像处理函数的DLL

在C++平台上使用OpenCV进行图像拼接,然后在C#中调用拼接后的全景图像。

weixin_44768602的博客 790

C#调用opencv

最经做一个项目,底层调用openCV编写的图像处理程序,用户界面采用C#编写。 于是学习了相关技术,总结如下: C#编写的是托管代码,编译生成微软中间语言,而普通C++代码则编译生成本地机器码,这两种语言不能直接混合编程。常见的方式是: 1)将本机C++代码(指非托管C++)编译成一个dll,供C#调用,调用方法为 [DllImport(×××.dll)] 。但是这里只能从 DLL 导

azhexg的专栏 2万+

10 个开源 Python OpenCV 小项目,YouTube热门

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自 | 新机器视觉 1.DrowsinessDetector睡意检测https://gi...

小白学视觉 2511

使用C++ DLL文件制作OpenCV,C#调用OpenCV函数

在本文中,我们将讨论如何使用C++创建一个包含OpenCV函数的动态链接库(DLL)文件,并且如何在C#中调用这些函数。通过将OpenCV函数封装在DLL文件中,我们可以在C#应用程序中方便地调用这些函数,从而实现图像处理和计算机视觉任务。这就是使用C++创建OpenCV DLL文件,并在C#中调用OpenCV函数的基本过程。你可以根据自己的需求,编写更复杂的OpenCV函数,并将其封装在DLL文件中供C#应用程序使用。现在,我们可以在C#中引用并调用我们创建的OpenCV DLL函数。

WzisTypescript的博客 586

c#调用python opencv_如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

写在前面:学习CUDA过程中看到了可以用OpenCV写一个类,然后直接调用的方法,感觉很有意思(基础太差,可能这是个很基础的问题)。于是就想在 C# 中调用OpenCV的方法,发现有点麻烦,需要生成 .dll(动态链接库)文件,生成过程中出了些小问题,所以把这个过程记录下来,以备以后查看。首先,你的电脑上需要安装OpenCV,具体安装过程百度即可,并不难(具体可以参见我转载的另一篇OpenCV配置...

weixin_35871890的博客 902

OpenCV的8个dll文件

OpenCV的八个dll文件 包括(cv100.dll cvaux100.dll cvcam100.dll cxcore100.dll cxts001.dll highgui100.dll libguide40.dll ml100.dll) 放到OpenCV软件的同目录下 或者放到C:\Windows\System32\

利用wolcmd.exe批处理执行远程唤醒

代码如下: @echo off cls :check if exist wolcmd.exe goto targetmac echo 缺少wolcmd.exe echo. goto end :targetmac cls echo -------------------------------------------------------- echo 目标主机PC-01地址:40235678A...

Chriseo的博客 6947

如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

写在前面:学习CUDA过程中看到了可以用OpenCV写一个类,然后直接调用的方法,感觉很有意思(基础太差,可能这是个很基础的问题)。于是就想在 C# 中调用OpenCV的方法,发现有点麻烦,需要生成 .dll(动态链接库)文件,生成过程中出了些小问题,所以把这个过程记录下来,以备以后查看。 首先,你的电脑上需要安装OpenCV,具体安装过程百度即可,并不难(具体可以参见我转载的另一篇OpenCV

小小学渣的博客 1万+

SerDes硬件设计原理介绍

接收端:外部差分串行数据------线性均衡器----(CDR从数据中恢复出采样时钟)-----解串器(串行信号转并行信号)-------8B/10B的解码器或解扰器-----FIFO-----FPGA接受差分并行数据。发送端: FPGA发送差分并行数据----FIFO------8B/10B编码器或者扰码器-----串行器(并行信号转串行信号)-----均衡器(滤波)--------TX串行信号差分外发。串行器:8bit的并行数据----2bit的并行数据----1bits的串行数据。

weixin_42304393的博客 1108

C#调用OpenCV(C++原版)思路和实现方法(小白教程)

为什么要本地安装呢?因为既然调用那么必须是要获得相应OpenCV接口的调头文件或者C++文件!c#和C++虽然两者衍生自C语言爸爸,两者更是有多个类似的地方,但是终究语言环境的差异,这两者并不能互通,但是做好接口和生成和调用.dll(动态链接库)就可以无缝连接,这也是目前C#做视觉应用的一个常用点!既然要用到第一种方法那么就要建立一个C++空项目来生成.dll文件!点击头文件夹,右键点击添加->添加新建项(或者点击头文件后,快捷键Ctrl+Shift+A) 接着添加demo.h内容: 2.添加cpp文

SteveDraw的博客 1万+

用python提取PDF中各类文本内容的方法

用python提取PDF中各类文本内容的方法

安静的软件工程师 6086

车辆动力学仿真模型的可信度评估方法

以转向工况测试为例,实车采集的方向盘转角作为车辆动力学模型的输入,记录车辆动力学模型的横摆角速度的输出结果,计算横摆角速度的幅频特性,根据《GB/T 6323-2014 转向盘角脉冲试验》的方法,获取横摆角速度峰值、横摆角速度谐振峰频率、横摆角速度谐振峰水平,与采集的实车结果对比,并计算车辆动力学模型和实车对于关键对比参数的相对误差。由公式(2)计算可得,在制动工况和转向工况测试下,车辆动力学模型和实车的纵向车速、制动减速度、制动距离、横摆角速度基本一致,精度> 85%,具有较好的精度。

wangchen900705的博客 1958

c#调用c++ OpenCv dll的教程

c#应用程序调用opencv(c++).dll

zp247030438的博客 1389

正点原子stm32f103RChal库制作数字秒表:如用keil5和正点原子STM32F1开发板实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1264

【3】C#中多中不同的方法调用c++DLL(OpenCV)库完成图像处理

【1】算法思路 算法运行的思路由图所示 思路1 (1)c#中读入一张本地图片的路径;(2)将该路径传递给dll里面的函数,OpenCV根据路径打开图像,完成图像处理; (3)结果保存到C#中分配的内存中。(适用打开本地图片,进行处理) 思路2 (1)c#获取图像数据的在内存中的头部指针(图像可能为相机拍摄的图像存放在内存中,也可能为本地加载的图像保存到内存中)。(2)将指针传递给dll函数,调用OpenCV完成mat的重建,然后用OpenCV完成图像处理。(3)结果...

qq_33612665的博客 2510

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 141

【NodeRed】node-red-contrib-opcua实现PLC读写

在之前的博文【Node-RED】node-red-contrib-opcua-server模块使用(1)中,我们介绍了用node-red-contrib-opcua-server模块实现OPCUA服务端的,以及二次开发的内容。本节博文中我们采用官方社区自带的node-red-contrib-opcua组件开展对OPCUA客户端的介绍,详细阐述用该组件中OpcUa-Client节点实现客户端对PLC的读写,以及实现过程中遇到的问题。由于官方社区中并没有找到该组件的介绍实例,这也是本博文编写的第1个原因。

weixin_48618536的博客 958

【2】C#调用c++DLL图像处理库(OpenCV)以及图像数据数据转换

【1】配置环境 电脑配置:w764+vs2017+opencv4.3.0 解决方案配置:debug+x64(注意c++中的配置环境要和c#中的环境保持一致) 【2】实现思路 (1)c#中读入一个图片的路径。 (2)c#中调用c++的dll库,将图片路径传送到dll库中的函数。 (3)dll中的函数作用,完成图像处理,并将结果传送给c#中。 注意要点:(1)环境配置 (2)参数对应,c#的参数好c++里面的参数对应的不一样。 【3】编写dll库 步骤参考:C#调用c++的图像处理库(Op..

qq_33612665的博客 5072

【unity实战】完美的2D横版平台跳跃玩家控制器,使用InputSystem+有限状态机实现人物加速减速 多段跳 长短跳 多段攻击 冲锋 冲锋残影 滑墙 蹬墙跳 滑墙 土狼时间 预输入 攀爬 爬楼梯

【unity实战】使用unity的新输入系统InputSystem+有限状态机设计一个玩家状态机控制——实现玩家的待机 移动 闪避 连击 受击 死亡状态切换这次来实现一个2d平台平台跳跃玩家控制器,平台人物控制要做的好,要考虑的问题会有很多,比如移动加速减速 多段跳 冲锋 冲锋残影 滑墙 蹬墙跳 土狼时间 预输入 攀爬 爬楼梯//减速至于为什么叫这个名字(土狼时间)呢?其实这个名词来自于华纳兄弟动画公司,一部古老的动画系列影片《Looney Tunes》

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 6043

c++创建包含opencv的dll供C,C#调用

转 最近,接到了一个小任务,就是创建一个c++的dll,供c#调用。 dll又称动态链接库,其好处有很多,主要提供接口,供项目调用。 其中,要写一个函数,输入一张图片的路径,之后显示图像,并返回字符串,成功打开图像,返回“open”,失败则返回“can not open”。但是在编写过程中也出了一些问题,当参数以及返回值类型为string时,c#端会报“访问受保护的内存”,查了很多的相关资...

duiwangxiaomi的博客 1890

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Matlab风格的Plot类for Mat类OpenCV
下一篇: 一直可以打开的.sln文件,突然就无法读取项目文件“xxx.vcxproj”??
Timy_
博客等级 码龄9年 5粉丝 5原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值