需要声明的是:
1)官网下载的已经编译好了的opencv只提供了x64编译版本库,未提供x86编译版本的,如果需要在x86平台上使用opencv,那就得自己手动编译opencv源码为32位。
2)官网下载的已经编译好了的opencv目录下有vc14跟vc15两个目录,这两个目录分别存放的是经过vs2015编译的库跟经过vs2017编译的库。调用别人的库只要环境配置好了就可以在任意IDE调用,编译好的库是不依赖vs版本的,但是如果我们要编译,比如x86的库,就必须使用vs2015/2017。
对应关系如下:
vc 7 : Visual Studio2003
vc 8 : Visual Studio2005
vc 9 : Visual Studio2007
vc 10: Visual Studio2009
vc 11: Visual Studio2011
vc 12: Visual Studio2013
vc 14: Visual Studio2015
vc 15: Visual Studio2017
本文所用工程文件:https://download.csdn.net/download/weixin_42408280/43109616
将使用含有第三方库的函数封装成dll文件供别的工程调用,主要有两种方法:
这里主要分析使用函数进行打包dll。
建好工程后会发现工程目录下只有一个文件:
新建 -------》现有项 -------》头文件(.h)
目前有两个文件:.h头文件和.cpp
3、将要声明的函数写在.h中,由于生成的dll文件里的函数是要开放给别人调用的,故需在头文件中声明此函数为开放接口,即使用 __declspec(dllexport) 它是固定格式,后面跟函数的声明,修饰符__declspec(dllexport)使 DLL 能够导出该方法以供其他应用程序使用。同时,也应该加上opencv的头文件,使得函数可以使用opencv库:
#include
#include
#include
#include
//#include
#include
__declspec(dllexport) bool testBuildOpencvDLL(cv::Mat& imgInput, cv::Mat& imgOutput);
4、将要实现的函数功能写在这个cpp中,本文仅仅是实现调用opencv函数将bgr图片转为灰度图,代码如下:
#include "buildExtraWorkpieceCenter_dll.h"
bool testBuildOpencvDLL(cv::Mat& imgInput, cv::Mat& imgOutput)
{
cv::cvtColor(imgInput, imgOutput, cv::COLOR_BGR2GRAY);
return true;
}
5、配置输出属性:
6、编译生成
在工程目录下会生成如下几个文件:
完成dll的生成!!
dll的调用有两种方法:静态调用和动态调用。
静态调用需要将.h,.lib以及.dll文件拷贝到与目标调用工程exe同一目录下,而动态调用仅需要dll文件。本文以静态调用为例。
静态调用DLL
1、新建工程:
新建项目:新建 -------》项目 -------》windows桌面 -------》控制台应用(当然也可以建一个 空项目)
建好工程后只有一个文件:
在此cpp文件下可编写调用前面生成的dll里面的函数。
2、编译生成存放可执行的目录
3、拷贝前面生成的.lib以及.dll文件到目标工程的exe的同目录下,即上图的目录:
如果生成的dll中的函数有需要用到生成dll的头文件中定义的话此处还需要将生成dll的头文件放到如下位置
4、在调用dll文件的工程的cpp文件中添加调用dll函数的代码,本文只是调用并显示出结果:
#include
#include
#include
#include
#include
//#include
#include
bool testBuildOpencvDLL(cv::Mat& imgInput, cv::Mat& imgOutput); //这个dll中的这个函数仅仅只是将输入图片转成灰度图而已
int main()
{
cv::Mat src = cv::imread("C:\\Users\\dell\\Desktop\\vs_prj\\buildAndCallOpencvFunctionDLL\\callOpencvDLL\\test1.jpg");
cv::imshow("src img", src);
cv::Mat dst;
testBuildOpencvDLL(src, dst);
cv::imshow("dst img", dst);
cv::waitKey(0);
return 0;
}
5、配置调用dll文件的工程属性:
配置属性 -------》VC++目录 -------》库目录,,,添加拷贝过来的lib所在的路径:
6、配置属性 -------》链接器 -------》输入 -------》附加依赖项 -------》编辑加入lib的文件名(全名包含后缀)
当然,这里可以不用加这个附加依赖项,不加的话需要在cpp文件那里加上一条指定lib的语句:
#pragma comment(lib, "buildExtraWorkpieceCenter_dll.lib")
两种方法二选一即可。
这里需要补充前面的:如果生成的dll中的函数有需要用到生成dll的头文件中定义的话除了需要前面指出的需要将头文件放在目标工程对应的文件夹下,还需要在目标工程的cpp或头文件中进行include:
由于本文的代码是并不需要用到生成dll的头文件里的定义的,故本文可不加。
7、编译运行:
动态调用dll下次有时间再写吧^-^!!
最后分享一句很喜欢的话:
人生的三次成长:第一是发现自己不是世界中心的时候;
第二是发现即使再怎么努力终究还是有些事令人无能为力的时候;
第三是明知有些事可能会无能为力,但还是会尽力争取的时候。
陌生人,每天都要快乐鸭!!