目录
一、安装vs2015
安装简单,一路next,不做记录。
二、安装64位opencv
2.1、下载
前往opencv官网下载地址下载OpenCV的Win pack版,我下载的是opencv-3.4.9-vc14_vc15.exe。
2.2、安装
下载的opencv为自解压版本,运行exe文件,指定自解压目录即可。我的解压目录是D:/opencv解压后将名称改为opencv349,因为可能实际项目中遇到各种版本,为以后不同版本区分,这样我的opencv的build目录即为:D:\opencv\opencv349\build。注意所有的安装环境都不要出现中文路径,虽然不少软件中文环境支持越来越好,但为了省去不必要的麻烦,还是老老实实的使用英文路径。
2.3、环境配置
将opencv的vs2015相关路径添加到path环境变量中。我的路径为:“D:\opencv\opencv349\build\x64\vc14\bin”;环境配置完成重启。cmd下执行opencv_version如果能输出opencv版本则环境变量生效。
三、opencv视觉库测试
3.1、配置工程
-
- vs2015新建一个win32控制台工程。因为我的opencv安装目录build下只有x64,所以工程选项设置x64;
- 在配置属性》C/C++》附加包含目录中添加D:\opencv\opencv349\build\include配置工程依赖的opencv头文件;
- 在配置属性》链接器》附加库目录中 添加D:\opencv\opencv349\build\x64\vc14\lib;配置工程依赖的opencv库文件;
- 此时如果编译opencv工程会报“无法解析的外部符号”的错误,还需指定外部依赖库。在配置属性》链接器》附加依赖项 中添加opencv_world349d.lib英文分号与其他依赖项区分开,如果目标为release版本则添加的是opencv_world349.lib,debug则是带d后缀的。
3.2、测试功能
在新工程的main函数实现如下代码:
#include "stdafx.h"
#include <iostream>
#include "opencv2/opencv.hpp"
int main()
{
cv::Mat img = cv::imread("test.jpg");//载入一张图片
cv::imshow("测试图片", img);//显示图片 窗口名为“测试图片”
cv::waitKey(0);//等待任意键(暂停)
return 0;
}
其中test.jpg为一张测试jpg图片,路径自定义。编译运行则出现显示图片的窗口。自此opencv+vs2015环境搭建完成,可以进行opencv开发。
以上只是简单的测试,由opencv官方提供的x64库来验证,基本按部就班即可,下面尝试下编译安装x86库。
四、32位opencv编译安装
4.1、安装cmake工具
前往cmake下载网址下载cmake,因为我的环境是win10x64位所以我下载的是cmake-3.18.0-rc1-win64-x64.zip,。解压后即可。
4.2、生成opencv的vs2015工程
运行解压目录下的bin/cmake-gui.exe;出现如下画面:
其中source code选择opencv源码目录,build the binaries选择生成目录,我是在opencv的build下新建了一个x86目录(此处建议另选文件夹,在随后生成工程中会生成大量中间文件)。完成后点击configure。
选择vs2015,其他默认,点击finish,等待完成,中途不要断网。
1、Configure , 等待完成;然后会出现红色错误,此时查看CMakeDownloadLog.txt文件发现因为要下载opencv_ffmpeg.dll,opencv_ffmpeg_64.dll,ffmpeg_version.cmake和ippicv_2019_win_ia32_20180723_general.zip文件失败。而log文件中有它们的下载地址,在浏览器中打开https://raw.githubusercontent.com下载地址发现无法打开,此时需要修改hosts,修改C:\Windows\System32\drivers\etc\hosts添加如下内容:(参考博客)建议不要先修改hosts,因为即使修改了hosts用cmake下载也会非常的慢,也大概率下载失败,先下载出错生成0字节大小的中间文件,再用已下载的文件替换中间文件比较合适。(这一步不做不影响opencv库编译影响下面opencv_contrib编译,如果只编译opencv库只需再次点击Configure即可)
# GitHub Start
52.74.223.119 github.com
192.30.253.119 gist.github.com
54.169.195.247 api.github.com
185.199.111.153 assets-cdn.github.com
151.101.76.133 raw.githubusercontent.com
151.101.108.133 user-images.githubusercontent.com
151.101.76.133 gist.githubusercontent.com
151.101.76.133 cloud.githubusercontent.com
151.101.76.133 camo.githubusercontent.com
151.101.76.133 avatars0.githubusercontent.com
151.101.76.133 avatars1.githubusercontent.com
151.101.76.133 avatars2.githubusercontent.com
151.101.76.133 avatars3.githubusercontent.com
151.101.76.133 avatars4.githubusercontent.com
151.101.76.133 avatars5.githubusercontent.com
151.101.76.133 avatars6.githubusercontent.com
151.101.76.133 avatars7.githubusercontent.com
151.101.76.133 avatars8.githubusercontent.com
# GitHub End
此时建议不要通过CMake来下载文件,因为会非常的慢而且极有可能下载失败,通过第三方工具将这四个文件下载下来,替换掉sources/.cache相关的文件,文件名还保留.cache下的原来文件名,因为Configure时根据文件名的字符校验hash再拷贝。
2、再次点击Configure,此时无报错,出现Configuring done;
3、勾选BUILD_opencv_world,用于生成opencv_world349.dll;
4、点击Configure,等待Configure done;
5、点击Generate按钮生成VS工程,出现Generating done 成功;
6、点击open project按钮直接打开工程;
7、在vs2015菜单中 生成》批生成 中勾选ALL_BUILD的Debug和Release以及INSTALL的Debug和Release,然后点击生成(约需30分钟); 成功通过,此时在build/x86/install下有相应的库和头文件。
至此opencv的x86编译安装完成,先不要关闭cmake-gui,下面还要编译opencv_contrib;第3,4步骤建议加上,不然后面生成的是单个库,写程序的时候一个个查找链接库很麻烦,如果加上后生成一个opencv_workd349库,链接这一个库就行,因为是了解入门opencv先不加上。
五、编译安装opencv_contrib
前边编译的是opencv的基础模块,opencv将算法模块单独分离出来放到opencv_contrib中,所以我们还需安装opencv_contrib库,大致步骤和第四步相同,但是我尝试在第四步一起编译opencv_contrib时出错,所以先编译安装opencv再编译安装opencv_contrib。
5.1、下载
前往opencv_contrib下载地址下载和opencv一样的版本,版本不一致别的博客说会有各种异常问题。下载opencv_contrib-3.4.9.zip完成后解压,修改名字为opencv_contrib349。
5.2、生成opencv+opencv_contrib工程
- 此处在4.2步骤基础上
- search 对话框中输入OPENCV_EXTRA_MODULES_PATH,
找到OPENCV_EXTRA_MODULES_PATH后在value中填入编译opencv_contrib解压目录中的modules路径,我的路径是:D:\opencv\opencv_contrib349\modules,如下: - 搜索栏中输入 OPENCV_ENABLE_NONFREE ,在value值中点击选中。如果没有选中,那么类似SIFT这种已经被申请专利的方法就无法使用如下:
- 点击configure等待出现Configuring done(此时还会有红色异常,不用管再次Configure直到红色消失);
- 点击Generate按钮生成VS工程;
- 关闭之前的vs2015工程,点击Open project使用vs2015打开opencv工程;
- Vs2015中生成》批生成勾选ALL_BUIL的Debug/Release和INSTALL的Debug/Relase如下:
- 然后点击生成,等待30分钟左右成功通过,在
D:\opencv\opencv349\build\x86\install\下也生成了相应的include以及x86对应的bin和lib文件。
六、测试x86库
6.1、拷贝x86库和bin文件
最终在install/x86下生成了x86的bin文件和lib库,将此文件放到合适位置,我仿照x64库位置将install下的x86文件夹放在了build/下。
如果是生成的opencv_world349库需要修改环境变量,将之前path的x64环境变量修改为x86的,如果没有这一步后面vs工程编译通过但是运行时会报错“应用程序无法正常启动c000007b”。
如果生成的是单个库不用修改环境变量,需要将相应的dll拷贝到可执行程序同一目录下,运行exe看缺啥拷啥。
6.2、opencv测试工程使用x86配置
之前的opencv测试工程修改目标平台为x86平台,链接库目录修改为新生成的x86库路径;因为这一次编译没有指定BUILD_opencv_world,所以要指定链接的opencv库;可以在属性》链接器》输入》附加依赖项 中将之前的opencv_world349d.lib换成需要的库,也可以在程序里声明。
程序中声明main函数如下:
#include "stdafx.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
#ifdef _DEBUG
#pragma comment(lib,"opencv_core349d.lib")
#pragma comment(lib,"opencv_highgui349d.lib")
#pragma comment(lib,"opencv_imgcodecs349d.lib")
#else
#pragma comment(lib,"opencv_core349.lib")
#pragma comment(lib,"opencv_highgui349.lib")
#pragma comment(lib,"opencv_imgcodecs349.lib")
#endif
int main()
{
cv::Mat img = cv::imread("test.jpg");//载入一张图片
cv::imshow("测试图片", img);//显示图片 窗口名为“测试图片”
cv::waitKey(0);//等待任意键(暂停)
return 0;
}
重新生成解决方案,编译运行通过。
七、关于BUILD_opencv_world选项
加上BUILD_opencv_world会生成opencv_world349.lib,在调试程序是只需要链接这一个库即可,便于调试程序,但是需要申明环境变量,不便于程序发布。
不加BUILD_opencv_world编译时会分别生成各个lib和dll,需要自己找到程序的依赖库做申明,不便于调试程序,但是在发布程序时只需将用到的dll放到可执行程序同目录即可,不需要申明环境变量,比较友好,各取所需,我是初学者打算不加上BUILD_opencv_world,这样更好理解每个功能对应的模块。
关于如何查找函数对应的是哪个库,在lib目录下使用findstr 搜索,比如需要找到imread在哪个库里实现,cmd下进入到库目录使用如下命令:findstr /I "imread" *.lib输出结果带有opencv_imgcodecs349字样,就找到了实现库。