第一篇在简书的记录, 主要是记录自己多次配置 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]
image
然后会在下方生成一堆输出信息, 这时候常常遇到错误, 下面是几个我遇到的情况:
(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, 最后才成功.
image
(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 <opencv2\opencv.hpp>
- #include <iostream>
- 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 配置成功
来源: http://www.jianshu.com/p/362f60ac38a5