在学习OpenCV特征检测与匹配时,因为OpenCV3.x版本将SIFT、SURF、ORB算子等的源代码从官方发行的基础版移除,转移到了opencv_contrib扩展库中的xfeatures2d中。想要使用这些算法需要重新下载编译扩展库。网上资料五花八门,但是在却没有一个有完整流程的资料。于是乎,就有了这边文章。一是为了让自己更加熟悉+记录学习,二也是希望能为后来人提供些便利。
本篇文章开发环境是Visual Studio,编译使用的是CMAKE,各种版本号如下:
主机系统:Win10 x64
Visual Studio:2019(VS16)
OpenCV:3.4.11
opencv_contrib:3.4.11(这个版本需要和OpenCV版本一致)
CMAKE:3.21.3
首先要做的是把各种需要的东西下载好,以下是下载链接(还是建议各种去各个官网下载)。
免费的开发人员软件和服务 - Visual Studio免费产品/服务: Visual Studio Community、Visual Studio Code、VSTS 和 Dev Essentials。https://visualstudio.microsoft.com/zh-hans/free-developer-offers/
Releases - OpenCVhttps://opencv.org/releases/
PS:不建议选择最新版本,懂的都懂。
GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modulesRepository for OpenCV's extra modules. Contribute to opencv/opencv_contrib development by creating an account on GitHub.https://github.com/opencv/opencv_contrib
PS:还是那句话,需要和OpenCV版本一致。
也许大概这东西其实没什么步骤。
OpenCV和opencv_contrib的安装过程实际上就是解压过程,建议解压在除C盘外的盘,解压完成后得到(自己改了文件名):
Visual Stuio和CMAKE就一路next的就完了。安装完大概就是这样。
打开CMAKE,填写相关参数,包括:OpenCV源码目录和OpenCV.sln工程的导出目录
添加完扩展包路径后,勾选:
BUILD_opencv_world(为了避免配置属性表时一大堆的依赖项)
BUILD_EXAMPLES(编译opencv自带的程序案例,可不选)
OPENCV_ENABLE_NONFREE(我们的目的)
然后再次点击configure进行编译,注意下面红框部分,都看一遍,不爆红的就没问题了,然后点击Generate就欧克了。
不爆红的话Generate以后就like this。
不过大概率是会爆的,会出现类似这种报错。
这些错误一般都是因为下载文件失败导致的,so我们换个网络下载,一直下载失败就手动.jpg。
关于错误信息可以D:\OpenCV\cmake_contrib_opencv(输出目录)\CMakeDownloadLog.txt中查看,打开可以看到以下内容。不同版的OpenCV丢失的文件会有不同。
#use_cache "D:/opencv/opencv346/sources/.cache"
#do_copy "opencv_ffmpeg.dll""41b81bb9a50cabd4bea385f7b50a069a" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/fe71c0ad807fdc33c2178e48e488f1e9b177c39a/ffmpeg/opencv_ffmpeg.dll""D:/opencv/opencv346/contrib_build/3rdparty/ffmpeg"
这里的意思是说将 opencv_ffmpeg.dll(它的md5签名是 41b81bb9a50cabd4bea385f7b50a069a,下载地址是 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/fe71c0ad807fdc33c2178e48e488f1e9b177c39a/ffmpeg/opencv_ffmpeg.dll" )
从 "D:/opencv/opencv346/sources/.cache" 拷贝到 "D:/opencv/opencv346/contrib_build/3rdparty/ffmpeg"目录下。
#missing "D:/opencv/opencv346/contrib_build/3rdparty/ffmpeg/opencv_ffmpeg.dll"
#check_md5 "D:/opencv/opencv346/sources/.cache/ffmpeg/41b81bb9a50cabd4bea385f7b50a069a-opencv_ffmpeg.dll"
#mismatch_md5 "D:/opencv/opencv346/sources/.cache/ffmpeg/41b81bb9a50cabd4bea385f7b50a069a-opencv_ffmpeg.dll" "d41d8cd98f00b204e9800998ecf8427e"
#delete "D:/opencv/opencv346/sources/.cache/ffmpeg/41b81bb9a50cabd4bea385f7b50a069a-opencv_ffmpeg.dll"
意思是目标目录下没有此文件
#cmake_download "D:/opencv/opencv346/sources/.cache/ffmpeg/41b81bb9a50cabd4bea385f7b50a069a-opencv_ffmpeg.dll"
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/fe71c0ad807fdc33c2178e48e488f1e9b177c39a/ffmpeg/opencv_ffmpeg.dll"
意思是准备cmake下载此文件到源代码路径 /.cache/ffmpeg/,并命名为"md5-文件名"
# timeout on name lookup is not supported
# Trying 151.101.228.133:443...
# TCP_NODELAY set
# Connected to raw.githubusercontent.com (151.101.228.133) port 443 (#0)
# schannel: ALPN, offering http/1.1
# schannel: failed to receive handshake, SSL/TLS connection failed
# Closing connection 0
# schannel: shutting down SSL/TLS connection with raw.githubusercontent.com port 443
# Send failure: Connection was reset
# schannel: failed to send close msg: Failed sending data to the peer (bytes written: -1)
#
意思是连接到服务器超时失败
cmake_download后面的就是下载失败的文件,下载的网址就在后面。然后这些下载失败的就需要我们自己下载了,推荐一个代理下载网站(自己去官网下也可以)。
GitHub Proxy 代理加速https://ghproxy.com/注意在代理网站下载后打开是网页格式,就像下面这样,需要另存为文件。
文件名有两种选择:
1、重命名为md5-文件名,然后放在check_md5后面显示的文件夹内;
2、直接以文件命名,然后放在目标路径下(不用重命名)
等把所有文件全部下载以后重新configure进行编译,还有爆红就重复流程,一直到不爆红,然后点击Generate。到这编译就完成了。
打开编译以后的文件夹,找到OpenCV.sln工程文件,打开它。
照上面流程来算上例子,应该是490个项目,因为流程没有什么太大坑就懒得截了,借用了别的博主的图片。
用VS 2019打开OpenCV.sln工程,在解决方案中可以查看工程目录:
编译生成debug版本的库,记得在此之前要选择编译的平台信息,这就是编译生成debug版本和release版本的区别,也可以选择release,因为自己的工程可能要用到相应的动态链接库
找到CMakeTargets中的INSTALL,然后右键选择“仅限于项目”-->“仅生成INSTALL
然后,在工程目录下的install目录中,可以看到生成了一堆文件
然后配置环境变量,把刚生成的****\install\x64\vc16\bin作为环境变量加入(如果之前有OpenCV务必替换它),配置完环境变量最好注销一下。
最后配置属性表,把新的库文件和依赖项配置到项目属性表里。
VC++目录-->包含目录,添加:
D:\OpenCV\cmake_contrib_opencv\install\include
D:\OpenCV\cmake_contrib_opencv\install\include\opencv
D:\OpenCV\cmake_contrib_opencv\install\include\opencv2
VC++目录-->库目录,添加:
D:\OpenCV\cmake_contrib_opencv\install\x64\vc16\lib链接器-->输入-->附加依赖项,添加:
opencv_img_hash3411d.lib
opencv_world3411d.lib
这里说一句,之前如果没有勾选BUILD_opencv_world的话lib文件会有很多,不过也没有关系,把所有lib文件全部添加进去也是没有问题的。
到这就over了,如果没有出现其他问题就可以使用了。
也没啥总结,事已至此睡大觉吧。
ps:某些在外网把资源下载下来扔在CSDN赚积分的挺离谱的
参考
在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib - 只需一步 - 博客园
CMake编译OpenCV3.4.6时opencv_ffmpeg.dll等下载失败的解决办法_star_of_science的博客-CSDN博客