【1】基于OpenCV的DLL动态库隐式连接

1DLL的作用

DLL是一个包含可由多个程序同时使用的代码和数据的库。例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数。因此,每个程序都可以使用该DLL中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。这篇文章的目的就是让你一次性就能了解和掌握DLL。 代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,它们都以源代码的形式发布。由于这种复用是源代码级别的,源代码完全暴露给了程序员,因而称之为“白盒复用”。白盒复用有以下三个缺点: 

1.暴露源代码,多份拷贝,造成存储浪费;
2.容易与程序员的本地代码发生命名冲突;
3.更新模块功能比较困难,不利于问题的模块化实现; 

为了弥补这些不足,就提出了“二进制级别”的代码复用了。使用二进制级别的代码复用一定程度上隐藏了源代码,对于“黑盒复用”的途径不只DLL一种,静态链接库,甚至更高级的COM组件都是。 

使用DLL主要有以下优点: 

1.使用较少的资源;当多个程序使用同一函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其它在Windows操作系统上运行的程序;
2.推广模块式体系结构;
3.简化部署与安装。

2动态链接库和静态链接库的区别

函数库分为静态库动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

3显示链接和隐式链接的区别

隐式链接指将DLL的函数符号输出库LIB链接,在执行文件中IMPORT段加入一系列函数的入口点!程序在加载启动时自动加载这些DLL,并查找函数入口点!像普通的SDK程序要加入KERNEL32。LIB链接就是!这样的方法是当使用DLL多时,程序启动很慢、!     动态链接指显式加载DLL,利用LoadLibrary,GetProcAddress取得函数入口点,执行再释放,这种方法是程序简洁,快速!但是不利于输出太多函数的DLL使用!代码量太大!

4实例演示在C++中如何生成含有OpenCV库的dll文件

本实例是基于vs2017和OpenCV4.0.1(可以参考使用 代码亲测可行)

可以参考  https://blog.csdn.net/m0_37170593/article/details/76445972

(1)创建动态链接库(OpenCVDll1)

1.1创建dll项目

 

 1.2添加头文件(OpenCVDll1.h)

 

 1.3配置结果

1.4 在OpenCVDll1.h文件中添加申明要导出的函数

 

 

 1 #pragma once
 2 #include <iostream>
 3 #include <opencv2/opencv.hpp>
 4 #include <opencv2/core.hpp>
 5 
 6 using namespace std;
 7 using namespace cv;
 8 
 9 __declspec(dllexport) void threshold_processimage(Mat &inputimgage, Mat &outputimgage);//函数导出接口 即此函数是导出的
10 __declspec(dllimport) void threshold_processimage(Mat &inputimgage, Mat &outputimgage);//函数导入接口 即此函数是导入的

 

 1.5在OpenCVDll1.cpp文件中实现函数  注意 要在OpenCVDll1.cpp中添加OpenCVDll1.h

 

 

 

 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include "OpenCVDll1.h"
 4 
 5 
 6 void threshold_processimage(Mat &inputimgage, Mat &outputimgage)
 7 {
 8     Mat src = inputimgage;
 9     cvtColor(inputimgage, inputimgage, COLOR_BGR2GRAY);
10     threshold(inputimgage, inputimgage, 20, 255, THRESH_BINARY_INV);
11     outputimgage = inputimgage;
12 }

 

 1.6生成解决方案

 

 1.7生成结果

 

 

(2)加载动态链接库

 2.1新建一个c++项目

2.2将OpenCVdll文件中的三个文件导入至OpenCVtest文件夹中

OpenCVdll中三个文件位置

导入到OpenCVtest中

 

 2.3项目中分别添加

 

(3)验证动态链接库

 

#include "pch.h"
#include <iostream>
#include "OpenCVDll1.h"

int main()
{
	Mat outputimage;
	Mat inputimage = imread("01.jpg");
	imshow("显示原图", inputimage);
	threshold_processimage(inputimage, outputimage);//此函数是dll中的
	imshow("二值化图", outputimage);
	waitKey(0);
	return 0;
}

  

 

 

转载于:https://www.cnblogs.com/zi-song/p/11283424.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值