OpenCV是一个开源发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV中包括很多类型的算法包,还有第三方及专利算法。在实际工程中,经常需要根据特性定制库,这就需要自行编译OpenCV库。本文记录了编译OpenCV主体库 +contrib第三方库的过程,希望能让大家少走弯路。
本机环境:
windows10(x64)
visual studio 2019
cmake 3.19.2
一、准备工作
a.下载相同版本源代码
直接从github下载代码很慢,而且容易失败,因而采用了本人《解决github下载缓慢的稳定途径》中的方法。
opencv源码:https://github.com/opencv
注意:编译opencv-contirb,实际是将opencv与opencv_contrib两个仓库中的代码编译为一体使用。需要根据《解决github下载缓慢的稳定途径》中的方法,把这两个仓库同步到gitee.com,然后从gitee.com下载。
最近一个项目环境需要的是3.x的库,所以就选择编译3.4的opencv及对应版本的contrib。
!!!一定是相同版本。
gitee中选择opencv3.4分支下载
gitee中选择contrib3.4分支下载
解压两个下载的源码,放到 D:\opencv34 下,目录结构:
output 用来存储cmake生成的文件。
b.变通方式解决文件下载问题
cmake配置编译中的一个大坑是下载文件失败。因为cmake编译中,是从国外网站下载文件,很难成功。通过一些变通的方式,解决问题。
C:\Windows\System32\drivers\etc\hosts,是计算机解析互联网地址时,第一个参照的资源。如果把ip与域名的对照写在此文件,计算机访问互联网时,可以直接访问域名对应ip。
配置中 cmake是从raw.githubusercontent.com下载文件,如果不能有效访问此网址,则不能成功。此网站对应的ip是从 https://site.ip138.com 查询获得,至于网上很多地方介绍的 https://www.ipaddress.com 现在已经失效了。
raw.githubusercontent.com查询结果
raw.githubusercontent.com 在site.ip138.com上查询,返回是一个ip列表,可以从中进行筛选。
下面通过ping ip 的方式,查找反馈时间最短,且稳定的ip地址。
通过以上方式,确定了 151.101.228.133。使用时,最好按照上面方法自行选择一下。
到此,至少应该能成功连接到服务器。
在后面cmake中,下载失败会记录到D:\opencv34\output\CMakeDownloadLog.txt。
其中有下载地址,可以复制地址,让迅雷帮助下载。
为方便,稍后会将常下载失败文件放到网盘。具体如何处理参考下文。
#do_copy "boostdesc_bgm.i"
"0ea90e7a8f3f7876d450e4149c97c74f"
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i"
"D:/opencv34/output/downloads/xfeatures2d"
#missing "D:/opencv34/output/downloads/xfeatures2d/boostdesc_bgm.i"
【CMakeDownloadLog.txt下载失败记录实例,https://raw.githubusercontent.com/xx这项,即为文件地址。】
c.工作磁盘留出足够空间
编译后,工作目录磁盘占用近8.5G。所以,最好留出2-3倍的磁盘空间。
二、CMake配置项目
配置分3步完成:配置opencv 配置opencv_附加项 生成项目
a.配置opencv
cmake安装最新版即可,点击生成的桌面图标启动。
opencv解压目录
指定opencv source code位置:D:\opencv34\opencv
编译输出目录:D:\opencv34\output
点击左下角【Configure】
本机的generator for this project: vs2019
optional platform : x64 (因本机为x64) ,其他可选win32 、ARM、ISO
【Finish】,运行一会,底部出现【Configure done】。
!!!出现下载失败,就表示此步骤失败,需要重新操作。
如果底部显示有红色文字,一般是下载失败造成(下载会进行重试,花时间)。【Configure done】后,可以查看CMakeDownloadLog.txt,尝试用迅雷下载。
下载失败文件,CMakeDownloadLog.txt中会有正确放置位置的线索。
失败后处理:
用迅雷下载CMakeDownloadLog.txt中失败文件,参考上文准备工作部分。
通过观察:配置opencv,会在源代码目录下建立.chache目录,cmake自动下载到D:\opencv34\opencv\.cache中,每个项目一个子目录(重新操作时,成功下载的文件,不会被覆盖)。如果下载成功,会解压到D:\opencv34\output\3rdparty下对应目录。因而,只要能保证在对应目录有对应文件,就表示本步骤完成,后续才能成功!
进入ffmpeg目录
\.cache中文件名为: md5值-文件名 ,通过迅雷下载的文件没有md5值,如ippicv_2020_win_intel64_20191018_general.zip。手工加上md5值:879741a7946b814455eee6c6ffde2984-ippicv_2020_win_intel64_20191018_general.zip。此文件为压缩包,因为不清楚cmake具体如何解压,所以放在\.cache下,让cmake自己处理:
output\3rdparty中,因为迅雷下载的是单个文件,基本清楚放置位置,所以放在此处:
!!!如上处理后,删除output目录中内容,output\3rdparty除外。
重新启动cmake,配置opencv,就可以。(如果红色文字为查找python相关的,如果你不是用于python,可以忽略)
b.配置opencv_附加项
contrib路径指定
在第一步没有下载文件失败,【Configure done】后,进行附加项配置。
OPENCV_EXTRA_MODULES_PATH , 鼠标选择 D:/opencv34/opencv_contrib/modules
(注意:要选择,不要拷贝,windows下会把路径分隔符为 \,cmake认为是转移符号,报错)
OPENCV_ENABLE_NONFREE 如果要使用需专利授权的算法(如surf),选择此项。
BUILD_opencv_world 编译库为一个opencv_worldxx.dll/lib文件,否则是分成很多文件。一个文件便于管理,多个文件,节约空间、灵活,根据具体使用场景选择。
点击左下角【Configure】,状态信息中显示【Configure done】。
如果状态信息中出现红色下载文件失败的信息,则需要如下操作后,从头重新配置。
失败后处理:
失败文件还是记录在D:\opencv34\output\CMakeDownloadLog.txt 中,用迅雷下载(如果失败,稍后再尝试,国外线路不稳定)。
将下载后的文件,拷贝到 D:\opencv34\opencv_contrib\modules\xfeatures2d\src中。
!!!如上处理后,删除output目录中内容,output\3rdparty除外。
重新进行上面两步配置。此时,即使第二步还有下载失败信息,只要是迅雷已经下载过的,就可以忽略。
此步骤容易失败的文件,基本是这些。稍后会整理到网盘。
c.生成项目
完成上面两步配置后,即可生成项目。点击【左下角】的【Generate】。
Generate完成
三、编译opencv
在\output目录中,找到CMake生成的项目框架文件OpenCV.sln,双击用Visual Studio打开。
如图,选菜单【生成】--》【批生成】。
如图选择ALL_BUILD Debug/Release x64(根据配置时的选择)
INSTALL Debug/Release x64。
点击【生成】,开始编译opencv库。此过程约用时40分钟。直到出现下面生成:成功信息。
opencv生成的的库,在output\insall目录下。主要关注 include目录及x64目录,会在vc开发中被引用。
稍后会另外写一篇关于visual studio 如何调用此库的文章,可以关注。
本实验下载的代码及下载失败文件整理:
链接:https://pan.baidu.com/s/1p3407qZcANzTLlarCgwsVg
提取码:4xxh