第一篇在的记录,主要是记录自己多次配置opencv的血泪教训和经验。
安装配置库的路永远都是开头难的,我看了很多很多个教程,其中有一些是对没有什么编译经验的人十分友好的,平时因为不怎么接触C++这些语言所以手动编译就抓狂,写下此篇记录成长~
我的系统是win10 64位的,1050TI 之前已经安装了CUDA和Cudnn,这次主要想配置一个支持cuda加速的opencv,一开始安的是最新版4.2.0+对应contrib,用过VS 2015 /2015 blend /VS 2019 安装过每次都是老长时间了,最后一大堆报错,看着就揪心,最后把所有opencv删了下了4.1.0从头配置,才搞定的...都是泪啊(如果是python的直接pip install opencv-python就能自动安装了,只不过用不了cuda加速,c++源码配置可以参考下下面大佬们的教程)。
win10+anaconda3环境下安装opencv+opencv-contrib 4.2.0
opencv4.2.0 源码编译,win7+VS2015,DNN模块支持cuda加速
windows下详细配置VS2019+CUDA10.1+tensorflow2.0+tbb+gpu支持的opencv4.2.0(with_cuda)编译全过程
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Windows系统下OpenCV+Contrib+CUDA配置(VS2017+OpenCV3.4.3+CUDA10.0)
win10下编译opencv4.1.2,opencv_contrib for java
Windows10+VS2017+cmake 编译opencv4.1 + opencv_contrib(含cuda)
OpenCV 3 - 编译更强大的OpenCV(三) - BUG与崩溃齐飞
推荐大家去看B站贾志刚老师的OpenCV课程【传送门】,比较干货,个人感觉十分有用,走投无路的最后就是根据视频中的方法做的,然后居然就可以了。接下来是我自己在配置CUDA Opencv 4.1.0时的详细过程和所遇到的问题。小白友好!
一、前期准备工作
1.先给电脑连好网,有梯子的也要放好,这样下载某些文件不会出错,但没有也不要紧,也有对策。
2.如果安装了Anaconda是默认到base环境里的,这个可以在configure的时候改,确认一下自己的anaconda安在什么位置了(如果你有虚拟环境看下envs的路径)哦对,如果不打算用python的话好像一般也不用~。
3.重要的是看一下自己是不是有英伟达独显,并且搞清楚型号。例如我这个是GTX 1050Ti笔记本的显卡,可以通过 设备管理器 或者 驱动xx 鲁大师之类的查看。
二、整个过程
1.下载opencv和contrib扩展包源码
去opencv官网 ,点击上方Release 寻找OpenCV-4.1.0(新的版本可能不稳定或者对设备有些要求,建议新的不行就换以往稳定的版本),选择Windows版本进入下载。
或者上github ,点击release 找相应版本下载
下载opencv-contrib对应版zip本 (一定要和上面的版本一致)
2.cuda和cudnn的下载和配置
上面列出来的的教程里面都有详细介绍以及配置方法,这个我是之前就安好了,这次就不写了,有硬件条件、有耐心就一定能安上的。具体可以参考B站贾志刚老师的OpenCV课程【传送门】
3.下载安装cmake
下载安装msi版的cmake工具 地址 ,我用的是3.16版,也是不要用太新的,还是稳定为上具体详情可参考 win10 安装 cmake环境。一会编译OpenCV要用到的是cmake-gui.exe。
-----------------------接下来就是具体配置opencv的过程了-----------------------
4.解压opencv源码和contrib源码,可以放到不同位置,但没必要。
5.打开cmake gui.exe,在前面两行输入解压的opencv目录下的sources,其中build路径最好不要覆盖原来的build,可以另外建立一个cudabuild用来cmake。
然后点击下方的Configure,出现提示build路径不存在是否创建,点Yes即可。
在弹出的对话框选择Visual studio 14 2015(注14是2015,15是2017,16是2019),下方选择x64,然后点击Finish,开始cmake。【注,第一次configure】
然后会在下方生成一堆输出信息,这时候常常遇到错误,下面是几个我遇到的情况:
(1)cmake/OpenCVDetectPython.cmake 275(find python)
如果你是python3的一般会出现这种错误,提示python2的没有找到,这个错误可以忽略。
(2)download ippicv或者ffmpeg文件时超时
可能由于网络问题,无法正常下载,那么你需要手动下载之后放到指定位置再cmake,附地址【百度网盘】密码:an82
ippicv_2019_win_intel64_20180723_general.zip
opencv_ffmpeg.dll
opencv_ffmpeg_64.dll
附加contrib可能用到人脸特征的部分文件xfeature2d
4.2.0及以后还会用到:
opencv_videoio_ffmpeg_64.dll
opencv_videoio_ffmpeg.dll
face_landmark_model.dat
然后放到.cache里面对应文件夹位置上
假如因为下载问题configure失败之后,把上述手动下载的文件放到对应文件夹中,替换原来的文件,然后再重新编译即可(后面几次configure出现download失败的时候也这么做)。
6.勾选WITH_CUDA等项目再次编译
然后进行进行选项的选择然后再进行configure,搜索cuda,勾选STUBS和WITH_CUDA的选项,然后搜索extra,填上contrib里modules文件夹路径,然后根据自己情况选择勾选不勾选test相关的、python支持、matlab支持以及多线程Tbb的选项,去掉一些待会VS里build会快一些,但我这里没有额外操作,其他都是默认的。
设置完毕之后进行configure。【第二次configure】
7.生成
上一步完毕之后还有一部分是红色的,搜索cuda,再勾选cuda_fast_math,检查cuda路径以及算力cuda_arch_bin,这个为了避免出错都默认即可,注意有时候4.1.0以后的对显卡算力有要求会提示错误,把CUDA_ARCH_BIN去掉5.3以前的数字即可,你也可以在知道自己显卡算力的情况下填写自己对应的那个,还能起到节约时间的作用,然后进行generate生成。
然后得到信息configure done ,generate done即完成cmake阶段。如果在configure或者generate阶段出错则会报什么什么invaild的,可能是你extra那步modules路径写错了,一般把 \ 改成 / 就行了。
8.进入VS 2015生成
首先打开opencv/cudabuild目录(也就是上部configure/generate的目录)然后找到OpenCV.sln解决方案,然后以管理员身份打开VS 2015,然后再打开OpenCV.sln。一开始会有一段时间的加载过程,这个阶段耐心等待,不要上来就生成很容易死机的。
加载完成之后,其他保持默认即可,(有的教程讲到用Release x64)我这里只是在笔记本上试验运行因此保持了Debug x64,右键ALL_BUILD点击生成,然后就是漫长的等待。。。
在VS 2015中对工程进行build编译,这一步最漫长,从一个小时到五六个小时不等,你可以后台让他慢慢处理,或者睡一觉。处理完成之后找到INSTALL右键生成就行了。
这一步我们可以到opencv build目录下找到生成的install/x64/vc14/lib和dll看一下是不是都有了62个lib静态,65个dll动态。如果都没问题那么就基本宣告配置完成了。
这里插播一下我遇到的各种问题吧,为后来人排一下坑:
(1)版本问题。最一开始的不成功时,我用的4.2.0版本,默认打开的vs2015 blend编译,按照一些教程说的建议使用Release x64进行生成,结果中间出现了一堆警告,后来还有一些fatal error,最后出现了几百个生成失败,气得跺脚,无能狂怒。后来冷静一会,继续使用4.2.0版本从解压源码开始,但是使用了是VS 2019,并且使用了Debug、Release两个模式来批生成ALL_BUILD和INSTALL,时间长是肯定的了,电脑处理了一晚上一通宵,这个继续出现问题故障,最后失败143个,INSTALL失败,我: @#$%^&*。没办法最新版本确实有很多新功但是用不了啊,于是就用了一个比较不新的4.1.0来编译cuda,最后才成功。
(2)VS生成阶段可能遇到的问题
这里出现一大堆warning是正常的,可以忽略,只要不出现error就可以,最常见的问题如:
warning : field of class type without a DLL interface used in a class with a DLL interface
warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
warning C4702: 无法访问的代码
warning C4244: “=”: 从“float”转换到“unsigned short”,可能丢失数据
warning C4505: “__float2half_rz”: 未引用的本地函数已移除
还有一点,如果你都是用的默认的话安装配置完的空间会比较大,一定要找空间足的盘不然就会报错,然后就白等半天。我这个是吧两个源文件和最终的编译文件夹放在一起了,除了提到的都用的默认设置,总共需要24GB空间。
此外如果失败的没有那么多,可以在解决方案管理器中直接对提示生成失败的项目重新生成。
9.配置的最后一步,非常重要的一步就是配置环境变量!
编辑系统环境变量中的Path,写入对应的路径确定即可。如果你不需要进行cuda配置,可以直接在源解压之后的build文件夹中找到\x64\vc14\bin这个目录,把他添加到环境变量中去,这就可以使用无cuda版的opencv了。这一步完成之后需要将电脑重启一下生效(注销也可)
10.工程文件配置
在正式使用之前,需要对每个使用opencv的工程进行设置才能调用。具体步骤如下:
(1)在 视图 - 其他窗口 - 属性管理器,然后右键Debug模式下的Microsoft.Cpp.x64.user 属性,
把opencv的include目录和lib添加进去
包含include目录添加两个
库目录添加对应lib文件夹
链接器 - 附加依赖项 输入lib文件夹下的所有.lib文件名(不要放cmake文件),然后确定即可。可以使用脚本python来获取所有文件信息
4.1.0对应的文件名如下,可以直接拷贝进去
opencv_aruco410d.lib
opencv_bgsegm410d.lib
opencv_bioinspired410d.lib
opencv_calib3d410d.lib
opencv_ccalib410d.lib
opencv_core410d.lib
opencv_cudaarithm410d.lib
opencv_cudabgsegm410d.lib
opencv_cudacodec410d.lib
opencv_cudafeatures2d410d.lib
opencv_cudafilters410d.lib
opencv_cudaimgproc410d.lib
opencv_cudalegacy410d.lib
opencv_cudaobjdetect410d.lib
opencv_cudaoptflow410d.lib
opencv_cudastereo410d.lib
opencv_cudawarping410d.lib
opencv_cudev410d.lib
opencv_datasets410d.lib
opencv_dnn410d.lib
opencv_dnn_objdetect410d.lib
opencv_dpm410d.lib
opencv_face410d.lib
opencv_features2d410d.lib
opencv_flann410d.lib
opencv_fuzzy410d.lib
opencv_gapi410d.lib
opencv_hdf410d.lib
opencv_hfs410d.lib
opencv_highgui410d.lib
opencv_igcodecs410d.lib
opencv_imgproc410d.lib
opencv_img_hash410d.lib
opencv_line_descriptor410d.lib
opencv_ml410d.lib
opencv_objdetect410d.lib
opencv_optflow410d.lib
opencv_phase_unwrapping410d.lib
opencv_photo410d.lib
opencv_plot410d.lib
opencv_quality410d.lib
opencv_reg410d.lib
opencv_rgbd410d.lib
opencv_saliency410d.lib
opencv_shape410d.lib
opencv_stereo410d.lib
opencv_stitching410d.lib
opencv_structured_light410d.lib
opencv_superres410d.lib
opencv_surface_matching410d.lib
opencv_text410d.lib
opencv_tracking410d.lib
opencv_video410d.lib
opencv_videoio410d.lib
opencv_videostab410d.lib
opencv_xfeatures2d410d.lib
opencv_ximgproc410d.lib
opencv_xobjdetect410d.lib
opencv_xphoto410d.lib
如果你是其他版本的,那么可以用下面的python代码来输出文件名,注意去掉cmake的文件,只留.lib文件
测试代码如下:
import os
path ="G:\opencv4\opencv\cudabuild\install/x64/vc14\lib" #替换成自己的路径
dirs =os.listdir(path)
for f in dirs:
if os.path.isfile(os.path.join(path,f)):
print(f)
至此,opencv cuda版编译告一段落。
但要想使用opencv,还需要在实际工程中进行相关设置才能正常使用。
三、测试
#include
#include
using namespace std;
using namespace cv;
using namespace cv::cuda;
int main()
{
/*-------------------------以下四种验证方式任意选取一种即可-------------------------*/
//获取显卡简单信息1
//cuda::printShortCudaDeviceInfo(cuda::getDevice()); //有显卡信息表示GPU模块配置成功
//获取显卡详细信息2
cuda::printCudaDeviceInfo(cuda::getDevice()); //有显卡信息表示GPU模块配置成功
//获取显卡设备数量3
//int Device_Num = cuda::getCudaEnabledDeviceCount();
//cout << Device_Num << endl; //返回值大于0表示GPU模块配置成功
//获取显卡设备状态4
//cuda::DeviceInfo Device_State;
//bool Device_OK = Device_State.isCompatible();
//cout << "Device_State: " << Device_OK << endl; //返回值大于0表示GPU模块配置成功
system("pause");
return 0;
}
如果返回显卡信息则说明cuda配置成功