关于配置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<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文件已经删除重新生成试一下
返回-1,没有得到预期结果
我们将依赖项opencv库也拷过来,位置也可以防止Debug下面
执行成功得到正确结果。
四、总结
1、可以使用opencv的dll和lib封装得到另外一个dll提供给别的工程使用,但是该工程使用得时候仍然需要依赖opencv的dll
2、最后使用一般使用显示调用,只需要dll和头文件而不需要lib.