OpenCV4学习笔记(1.0)换一种方式从源码编译、安装 | OpenCV4.3.0以及Contrib | Win10 | CMake-GUI | VS2019 | HTTP代理
本篇博客会持续更新,将自己的心得体会、遇到的问题和解决方案记录下来。
目标
- 以源码编译的方式安装OpenCV与相应的Contrib扩展模块,但是不使用CUDA的相关功能(我的机器上没有配置CUDA的开发环境,所以无法编译CUDA相关的文件)
- 使用HTTP代理解决CMake的Configure、Generate阶段的文件下载失败问题,而非手动下载必要文件。
- 使用新建配置文件的方法在VS2019上配置OpenCV开发环境,后续工程直接导入已有的配置文件即可,无需重复配置。
ATTENTION!
有些事情真的只有经历了,才相信它确实存在,但是这种事还是想少经历点好。。。唉,眼泪好咸。。。
- 所有演示操作均已本人的设备、环境为例,读者可以根据需要自行修改、配置,需要遵守的规则我都会说明。
- 有些操作过程可能需要等待较长的时间,请一定要耐心等待,中途绝对不能强制停止,特别是使用VS的编译过程,强制停止可能会导致正在编译的文件损坏,甚至无法进行第二次编译。
- 使用命令提示符和PowerShell均可(之后统称为控制台,可以互相替换),但是必须运行在管理员权限下。
- 如果你的环境本身无法进行CUDA开发,那么就不能在预编译的时候选择CUDA的相关选项。不然的话,之后使用VS编译的时候会由于缺少相关文件,而发生编译错误。
- 这个教程只适用于Win10系统,Mac和Linux系统预编译之前,需要手动安装大量的依赖库,安装不全会导致编译完的OpenCV中的某些方法损坏,无法正常使用,此时只能安装必要依赖库后,重新预编译和编译OpenCV,才能正常使用。
下载CMake、配置CMake环境变量、下载OpenCV和OpenCV_Contrib源码、下载VS2019
下载CMake
- 下载Installer即可,后缀名为.msi,下载完成后即可直接安装。
- 这里我使用的是3.17.0版本,建议读者也使用该版本,当然也可以根据需要自行选择其他版本下载、安装。
配置CMake环境变量
- 因为需要从控制台启动CMake,所以需要将其添加到系统环境变量中,添加环境变量的操作在此不做演示,操作步骤与配置g++、gcc的环境变量是完全相同的。
- 配置完成后,以管理员身份运行控制台,输入cmake-gui,安装成功会弹出cmake-gui界面,否则不成功。
下载OpenCV和OpenCV_Contrib源码
到官方的Github里下载这两份源码,注意版本必须匹配,这里演示的版本为4.3.0。
下载OpenCV源码
- 下载后缀名为.zip格式的源码即可。
- 待下载完成后,在本地的目标文件夹下解压,保证文件目录除盘符名之外的其他所有文件夹名称均无中文,目标文件夹就是希望OpenCV安装到的文件夹,安装完成之后不能修改!
下载OpenCV_Contrib源码
-
下载后缀名为.zip格式的源码即可。
-
待下载完成后,在本地的目标文件夹下解压,保证文件目录除盘符名之外的其他所有文件夹名称均无中文!
-
OpenCV和OpenCV_Contrib的源码,路径之间不互相影响,没有特定的包含关系,但是编译、安装完成之后不能随意挪动OpenCV_Contrib包的位置。
下载VS2019
-
这里下载Community社区版即可,可以根据需要自行选择其他版本下载。
使用CMake预编译OpenCV源码
配置HTTP代理
这里是和其他博客最与众不同的地方,先来说一下原因。其实很简单,是因为按照网上大部分博客给出的解决方案,即手动下载文件放到指定目录的方法在我的机器上无效,而且暂时还没有找出问题的原因。最后只能放弃这个方法,另寻他路。
由于相关的资料十分匮乏,单就博客来说,大部分国内的博客都是手动下载缺失文件,而国外的博客则没有这些顾虑,自然就没有对这个问题的讨论,所以这部分的摸索属实不易。
我不是专门学习计算机网络相关的专业,所以有些用词可能不当,如有误导或错误,望大家指出,定及时更正!
需要借助代理服务器来下载编译过程中所需的文件,所以需要先对代理软件进行配置。
-
打开确保可以使用的代理软件(各种协议使用的软件不同,但是一般都可以转换成HTTP协议的代理,注意找一下自己使用软件的相关设置选项),确定同时开启了HTTP代理。
-
将HTTP代理服务器的IP地址和端口号复制下来,注意一定是HTTP代理服务器的IP地址和端口号,而不是SOCKS4/5代理服务器的IP地址和端口号,如果弄错了是无法使用的,下面以我的为例:
-
将HTTP代理服务器的IP地址和端口号添加到环境变量中,按理来说,可以在控制台中设置临时的HTTP代理,但是我这么设置是无效的,而添加到环境变量中是有效的。
具体格式如下:(两行都需要添加)
-
这两行说明HTTP代理服务器的IP地址为127.0.0.1,即回送地址,端口号为7890。
-
这只是我在软件中设置的端口号,一定要根据实际情况填写自己的HTTP代理服务器的IP地址和端口号,自己软件的端口号不一定是7890,要是有专门的HTTP代理服务器,IP地址也不是回送地址,直接照抄我的设置是无法正常工作的。
-
-
此时如果有控制台处于开启状态,需要先将其关闭,在保证代理服务器配置完成并打开了HTTP代理的时候重新打开控制台,保证环境变量被正常加载。
-
使用Cmake预编译完成之后,一定要记得删除这两条环境变量,不然的话会影响其他应用的联网。
使用CMake预编译OpenCV的源码
-
进入之前下载好的OpenCV-4.3.0文件夹。
-
创建一个名为build的文件夹,用来存放预编译输出的内容。
-
进入build文件夹之后,点击左上角的“文件”菜单项,以管理员身份开启PowerShell。
-
输入命令cmake-gui,打开cmake-gui界面。
-
输入源码路径和要生成编译好的二进制文件的路径。
源码路径是整个opencv-4.3.0文件夹,二进制文件路径是刚刚创建的build文件夹,下面以我的路径为例:
-
点击Configure,注意选择VS2019作为generator,之后,如果之前的HTTP代理服务器配置全部正常,这里的文件会全部下载成功,稍作等待,完成后会提示Configure done。
-
配置Contirb扩展模块的路径,这里只进行必须的两项设置,其他设置项读者可以根据需要自行设置或者到网上查阅相关资料。
这里需要注意的是,不要选择任何跟CUDA有关的选项,除非你的VS之前可以编译、运行CUDA程序,不然的话,用VS编译OpenCV源码的过程中,会由于缺少文件导致编译错误。
-
搜索extra关键词,配置Contirb扩展模块的路径,最后一级文件路径必须到modules,而不是opencv_contrib-4.3.0,这里以我的路径为例:
-
搜索world关键词,并将该项选中,表示启用拓展模块。
-
-
点击Generate,如果之前的HTTP代理服务器配置正常,这里的文件会全部下载成功,无需手动下载。稍作等待,完成后会提示Generate done。
-
点击Open Project,预编译好的项目解决方案文件OpenCV.sln将被VS2019打开,等待整个项目加载完成。
使用VS2019编译OpenCV源码
-
配置解决方案平台,对应生成的编译好的OpenCV只能在当前选择的平台上运行,这里我选择的是配置为Debug模式、平台为x86-64。
-
按下组合键Ctrl + Alt + L,打开解决方案资源管理器。
-
找到当前解决方案下的CMakeTargets文件夹中的ALL_BUILD项目和INSTALL项目,不需要打开。
-
右键点击ALL_BUILD项目,选择重新生成,等待编译完成。(参考时间:i9 9900KF为五分钟,Jetson TX2共计四十分钟左右)
-
右键点击INSTALL项目,选择重新生成,等待编译完成。(参考时间:i9 9900KF为五分钟)
-
编译完成之后,就完成了OpenCV的源码编译安装。
配置VS2019的OpenCV开发环境
采用创建配置文件的方式配置开发环境, 新建工程之后不需要重复配置,直接导入配置文件即可。基本按照参考网站中给出的博客进行配置,有些地方稍作修改。
-
找到当前项目的属性管理器,如果没有这个侧边栏,需要在顶部菜单栏视图-其他窗口中打开。
-
在x64 Debug下,创建一个新的配置文件,文件名称最好能够包含如下信息:
- 这是一个OpenCV的配置文件。
- 适用于机器字长为64位的计算机。
- 在VS的Debug模式下运行,而非Release模式。
-
双击打开创建的配置文件
-
配置通用属性->VC++目录下的包含目录,这里以我的路径为例:
-
配置通用属性->VC++目录下的库目录,这里以我的路径为例:
-
配置通用属性->链接器->输入下的附加依赖项,这里以我的路径为例:
- 配置附加依赖项的时候,直接添加新的绝对路径即可,不要把库文件复制到VS的根目录下,然后只添加相对路径,配置OpenCV的过程本来就很头疼,没必要让步骤变得更加繁琐。
-
配置完之后,一定要右键单击刚才配置的文件,然后点击保存。
测试程序
-
注意默认生成的解决方案.sln文件和mian.cpp不在同一个路径下,使用相对路径时,要注意图片的路径!
#include <opencv2/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat image; image = imread(samples::findFile("rubberwhale1.png"), IMREAD_ANYCOLOR); if (image.empty()) { cout << "Could not open or find the image" << std::endl; return -1; } namedWindow("Display window", WINDOW_AUTOSIZE); imshow("Display window", image); waitKey(0); destroyAllWindows(); return 0; }
如果你的图片能够正常显示,那么恭喜你!到此为止,所有的配置已经完成了!
附加
VC运行库版本、Visual Studio版本的对应关系
- Visual Studio 6:vc6
- Visual Studio 2003:vc7
- Visual Studio 2005:vc8
- Visual Studio 2008:vc9
- Visual Studio 2010:vc10
- Visual Studio 2012:vc11
- Visual Studio 2013:vc12
- Visual Studio 2015:vc14
- Visual Studio 2017:vc15
- Visual Studio 2019:vc16
VC运行库、OpenCV版本的对应关系
- opencv 2.4.10:vc10、vc11、vc12
- opencv 2.4.13:vc11、vc12
- opencv 3.4.0:vc14、vc15
- opencv 3.4.1:vc14、vc15
- opencv 2.4.10:vc10、vc11、vc12
- opencv 2.4.13:vc11、vc12
- opencv 3.4.0:vc14、vc15
- opencv 3.4.1:vc14、vc15