点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:OpenCV学堂

很多时候OpenCV开发者完成来了一个自定义的算法程序并不想给对方提供源代码调用,只想提供一个接口调用,这个时候我们可以把OpenCV的代码进行接口封装,然后导出成为DLL,给第三方应用程序调用,这个也是OpenCV开发者的基本功之一。下面分为两个部分来说明,第一部分是说明如何制作与生成DLL,第二部分说明如何调用导出DLL。

完整的示例以一个简单的图像卷积模糊为例,说明如何完成整个代码编写与DLL导出、参数传递与调用演示。

实现DLL程序编写与导出!

首先新建一个DLL的空项目,选择控制台应用,然后再选择DLL项目,图示如下:

点击完成,就得到了一个控制台应用,分别新建头文件与源代码文件,头文件中的声明与定义如下:

#pragma once
#pragma once
#ifndef DLL_CELL_H
#define DLL_CELL_H#include<opencv2/opencv.hpp>
#include<iostream>using namespace cv;
using namespace std;// 高斯模糊
const int GAUSSIAN_BLUR = 1;
// 均值模糊
const int SMOOTH_BLUR = 2;#endif

实现模糊的代码如下:

#include"myblur.h"//生成dll文件声明 , 支持高斯与均值模糊
extern "C" __declspec(dllexport) void myImageBlur(Mat &image,  int type, double sigma, int ksize);void myImageBlur(Mat &image, int type, double sigma, int ksize) {if (type == GAUSSIAN_BLUR) {Mat temp;GaussianBlur(image, temp, Size(ksize, ksize), sigma);temp.copyTo(image);}else if (type == SMOOTH_BLUR) {Mat temp;blur(image, temp, Size(ksize, ksize), Point(-1, -1), 4);temp.copyTo(image);}else {printf("Unsupported blur type....");}
}

完成代码部分之后,需要添加一个DLL声明模板文件,选择项目右键点击添加之后,对话框图示如下:

点击添加之后,把下面的脚本copy到文件中去

LIBRARY "blur_dll"
EXPORTS myImageBlur

其中:

第一行表示导出的DLL声明

下面的表示的导出的方法声明(给第三方调用的接口方法)

如果有多个方法,导出的格式如下:

方法名@方法序号, 举例如下:

LIBRARY "yourdllwithname"
EXPORTSMethod1@1Method1@2Methodn@n

然后选择当前的项目右键 ->生成,即可得到生成好的dll文件,至此DLL文件导出成功,截图如下:

调用导出的接口

这里分为两种情况,一种是静态调用,需要头文件、库文件支持,而且还要设置一堆配置。另外一种方式是直接加载DLL调用(动态调用),这种方法可以说是简单粗暴,只需要把编译好的dll文件copy到应用程序exe所在目录即可。

这里我们就采用第二种方法,首先新建一个OpenCV控制台空项目

加载DLL与调用接口方法的代码演示如下:

#include <iostream>
#include <Windows.h>
#include <opencv2/opencv.hpp>  typedef void(*Dllfun)(cv::Mat &image, int type, double sigma, int ksize);
int main()
{Dllfun myImageBlur;HINSTANCE hInst = LoadLibrary(L"blur_dll.dll");if (!hInst){printf("加载dll失败!\n");return -1;}myImageBlur = (Dllfun)GetProcAddress(hInst, "myImageBlur");// 加载图像cv::Mat src = cv::imread("D:/images/flower.png");cv::Mat copy = src.clone();cv::namedWindow("input", cv::WINDOW_AUTOSIZE);cv::imshow("input", src);// 高斯模糊myImageBlur(src, 1, 15, 0);cv::imshow("gaussian blur", src);// 均值模糊myImageBlur(copy, 2, 0, 15);cv::imshow("box blur", copy);cv::waitKey(0);return 0;
}

这里需要注意的是windows.h中会有很多跟OpenCV中冲突的方法与常量命名,所以在调用OpenCV相关函数方法与常量时候只有老老实实的把前缀cv::带上。

最终的运行结果如下:

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

实用技能 | OpenCV算法程序导出 DLL与调用演示相关推荐

  1. 实用技能--python库导出及bat批处理

    一.python库导出 requirements.txt 生成 pip freeze > requirements.txt requirements.txt 依赖库安装 pip install ...

  2. 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例

    在C++中,我们可以通过 __declspec(dllexport) 将函数导出为Dll中供其它程序使用,例如: _declspec(dllexport) int add(int a, int b); ...

  3. 动态链接库DLL创建及导出函数、调用DLL

    1.动态链接库(dll)概述 没接触dll之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息.它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其 ...

  4. c 调用易语言dll字节集,总结VC与易语言DLL互相调用的方法

    在编写程序的时候往往需要调用到别的语言编写的DLL文件,下面先来看一下在易语言中如何调用VC编写的DLL呢,首先用VC编写一个简单的DLL文件,代码如下: int WINAPI add(int x,i ...

  5. 使用Def文件导出dll

    前面我们介绍了dll的生成,大多数是使用extern "C"__declspec(dllexport)+函数名的方法导出dll.其实我们还有另一种方法来导出dll. 先介绍参考文献 ...

  6. 一个简单示例 利用jawin完成调用window中dll的调用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 最近由于 ...

  7. html css js调用dll,node调用dll 方法,及详细步骤

    Node – Dll Node调用DLL 1.DLL介绍 DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型.在Windo ...

  8. qt中实现息屏开平mousepress_Qt实用技能5-掌握信号槽使用细节

    目录 (放个目录方便预览.这个目录是从博客复制过来的,点击会跳转到博客) 简介 信号与槽的声明 信号-槽的使用 信号的使用 槽函数的使用 信号-槽的"元调用" 信号和信号的参数 注 ...

  9. 物联网课程学习目标_【笨办法学物联网】之一: 物联网工程专业四年里应该学习哪些实用技能傍身?...

    我列举一些我认为物联网工程专业毕业生应该具备的基本功. 你只需要花费5000元,同时投入一定的时间,就可以相比你的同学,大大提高理论水平和动手能力. 这些内容大四出去实习前最好能都入门,同时相对比较深 ...

最新文章

  1. 利用WiFi模块实现MicroPython远程开发
  2. 【推荐系统】推荐系统里,你是怎么Embedding的?
  3. 运行效果演示-修改applcation-db.xml 文件
  4. 20165105第三周学习总结
  5. 片偏移字段的值怎么算_搞懂钢丝网片计算原理,怎么算都不怕出错!
  6. c#泛型作为返回类型的写法
  7. CSDN写博客(字体颜色、大小)
  8. 华为与五粮液签署战略合作协议
  9. Spark Streaming之运行原理
  10. android 自定义view之雷达扫描,基于Android自定义控件实现雷达效果
  11. [洛谷P1119]灾后重建
  12. php正则 网址,php使用正则表达式获取字符串中的URL
  13. 【转载】实用的人际关系经验
  14. EXCEL VBA编程(excel办公高手必经之路)-曾贤志-专题视频课程
  15. 汪文君高并发编程总结-第一阶段
  16. python爬虫--看看虎牙女主播中谁最“顶”
  17. 什么是SSR(服务器渲染)
  18. 抖音服务器升级中无法修改名字,抖音名字改不了怎么回事
  19. html九九乘法口诀表代码,JavaScript九九乘法口诀表的简单实现
  20. postgresql查看数据库及数据表占用空间

热门文章

  1. 维基百科联手谷歌翻译,结果“惨不忍睹”!
  2. 如何写出符合Python审美的代码风格?
  3. AI人才招聘:估值超400亿美元,即将IPO的独角兽招AI专家
  4. 【AI参赛经验】汉字书法识别比赛经验心得——by:microfat_htu
  5. Google、Intel、Uber等巨头如何布局AI?听听他们自己人怎么说
  6. 可怕!Facebook竟能识别出性工作者!你怎么看?
  7. 面试官问:消息被重复消费,怎么避免?有什么好的解决方案?
  8. 打工人,从 JMM 透析 volatile 与 synchronized 原理
  9. RESTful 架构基础
  10. SpringBoot第九篇: springboot整合Redis