关于配置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兆的样子

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

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

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

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

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

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

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、设置预处理器

4、实现文件

#include"opencvdll.h"

#include"opencv2/opencv.hpp"

using namespace cv;

void imgshow() {

Mat img = imread("1.png");

imshow("test", img);

waitKey(0);

}

项目工程如下 :

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

三、导入使用

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

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

#include"Project2.h"

using namespace std;

#pragma comment(lib,"Project2.lib")

int main() {

imgshow();

}

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

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

再次运行成功了。

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

#include

#include

#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文件已经删除重新生成试一下

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

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

执行成功得到正确结果。

四、总结

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

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