关于配置VS配置Opencv的方法网上都有了,很多都是在VS环境配置整个opencv库,这样对于学习还是很方便的。下面记录两种另外的做法。

一、将opencv库用在自己的项目中

1、建立一个简单的工程:

#include"opencv2/opencv.hpp"

using namespace std;
using namespace cv;
int main() {
	Mat img = imread("1.png");
	imshow("test", img);
	waitKey(0);
}

2、解决方案目录下添加opencv2目录,是直接从..\opencv3.2\build\include下拷贝过来的只有2,3兆的样子

opencv dll 依赖库 opencv库调用_opencv dll 依赖库

3、解决方案目录下 opencv_lib是从..\opencv3.2\build\x64\vc14\lib下拷贝过来的

opencv dll 依赖库 opencv库调用_#include_02

4、设置包含目录、库目录和连接器输入

包含目录是为了能直接找到opencv2目录,库目录是为了找到opencv_lib下的库文件,如果这里不设置则需要再代码中使用隐式调用#pragma comment(lib,"opencv_world320d.dll")

opencv dll 依赖库 opencv库调用_头文件_03


opencv dll 依赖库 opencv库调用_opencv dll 依赖库_04

现在可以直接编译生成exe文件,但是运行的时候会报错找不到opencv_world320d.dll,将它拷贝到Debug目录下即可.

opencv dll 依赖库 opencv库调用_opencv dll 依赖库_05

 二、使用动态库的方式将其导出成dll使用

1、新建一个空项目,将输出类型设置为.dll

opencv dll 依赖库 opencv库调用_#include_06

2、定义头文件

#pragma once
#ifdef OPENCV_DLL
#define SHOWIMG_API extern "C" __declspec(dllexport)
#else
#define SHOWIMG_API extern "C" __declspec(dllimport)
#endif

SHOWIMG_API void imgshow();

 3、设置预处理器

opencv dll 依赖库 opencv库调用_#include_07

4、实现文件 

#include"opencvdll.h"
#include"opencv2/opencv.hpp"

using namespace cv;
void imgshow() {
	Mat img = imread("1.png");
	imshow("test", img);
	waitKey(0);
}

项目工程如下 :

opencv dll 依赖库 opencv库调用_头文件_08

 5、重新生成即可,在Debug目录下得到project2.lib和project2.dll

opencv dll 依赖库 opencv库调用_#pragma_09

三、导入使用

动态库的显式导入需要需要dll,和头文件,动态库的隐式导入lib、dll和头文件

3.1 隐式导入,需要lib,dll,头文件

#include"Project2.h"

using namespace std;

#pragma comment(lib,"Project2.lib")
int main() {
	imgshow();
}

opencv dll 依赖库 opencv库调用_头文件_10

因为使用project2.dll我们使用了opencv_world320d.dll库,所以需要将该库拷贝到Debug目录下

opencv dll 依赖库 opencv库调用_#include_11

因为我们在生成dll的时候在连接器的目录中输入了debug和release的lib,所以现在两个都要拷贝过来,如果最后发布应该只使用release吧

opencv dll 依赖库 opencv库调用_头文件_12

再次运行成功了。 

3.2 显示导入,需要dll,头文件以及window.h头文件

#include<iostream>
#include<windows.h>
#include"Project2.h"
using namespace std;

//隐式导入
typedef void(*show_img)();
int main() {
	HINSTANCE hdll = LoadLibrary("Project2.dll");
	if (hdll == NULL) {
		cout << "Load Dll Fail!" << endl;
		return -1;
	}
	show_img func = (show_img)GetProcAddress(hdll, "imgshow");
	if (func == NULL) {
		return - 1;
	}
	func();
}

目录下的lib文件已经删除重新生成试一下

opencv dll 依赖库 opencv库调用_#include_13

返回-1,没有得到预期结果

opencv dll 依赖库 opencv库调用_#include_14

我们将依赖项opencv库也拷过来,位置也可以防止Debug下面

opencv dll 依赖库 opencv库调用_opencv dll 依赖库_15

执行成功得到正确结果。

四、总结

1、可以使用opencv的dll和lib封装得到另外一个dll提供给别的工程使用,但是该工程使用得时候仍然需要依赖opencv的dll

2、最后使用一般使用显示调用,只需要dll和头文件而不需要lib.