起因
在利用openCV的GPU模块中 发现CUDA系列头文件找不到了
openCV2 cudaXXXX.hpp file not found.md
回想之前编译openCV源代码的时候,好像忘勾选CUDA了
解决方案
重编译openCV。。。
相关环境
openCV and contribute 4.1.0 -》后面尝试过 4.0.1-》还是确定为 4.1.0
cuda 10.1
cmake 3.14.3(默认安装并已添加环境变量)
vs 2017(默认安装)
TBB 4.4(可选)
题外话
CUDA SDK不支持mingw编译,因此选用的是VS编译器
先备注起来,以后可能会用到
这是mingw编译器的操作
打开命令行 cd 到你编译后的文件夹中 其中-j8是指用8个线程进行编译,你可以根据自己的计算机选择线程数量cd E:\program\opencv\CUDA_Build
mingw32-make -j8
我大概编译了15分钟mingw32-make install
编译前准备工作
1.安装CUDA toolkit
安装之前电脑需装配VS2017社区版,并且关闭其应用。更重要的一点:关闭360等软件。。不然会导致安装失败。
https://developer.nvidia.com/cuda-toolkit-archive选择对应版本 (本文 10.1)
一路默认就OK了(可以自定义下安装目录)
CUDA_BIN_PATH %CUDA_PATH%\bin
CUDA_LIB_PATH %CUDA_PATH%\lib\x64
CUDA_SDK_BIN_PATH %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH %CUDA_SDK_PATH%\common\lib\x64
然后,在系统变量 PATH 添加:
%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%
重启生效
检测是否安装成功
(以自带示例来测试)
命令行 cd C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v10.1\extras\demo_suite
分别运行deviceQuery、bandwidthTest
如果两次都出现result pass,则成功啦~~~
2.安装TBB(VS2015可安装,2017需要VC14才行)
(Thread BuildingBlocks,线程构建模块,是Intel公司开发的并行编程开发的工具)
https://github.com/01org/tbb/releases 选择对应系统 (本文 Win TBB 4.4)
然后设置环境变量:在系统-> 高级系统设置->环境变量->path 后边加入下边地址:
..(tbb安装目录)\tbb44_20160413oss\bin\intel64\vc14
3.检查V2017的vc版本
因为我安装的是最新版V2107,在最后用VS生成库文件的时候,出现了许多bug,具体可看最后的“遇到的问题”查看vc工具集版本
打开 C:\Program Files (x86)\Microsoft Visual Studio\2017
\Community\VC\Tools\MSVC (默认安装目录)
我安装目录是:E:\program\VisualStudio\VC\Tools\MSVC
如果vc版本大于14.11,请更换VC版本
具体操作查看文章 “遇到的问题”-》“VS生成过程中的问题”-》“2”
4.下载openCV4.1.0以及contribute源码
解压,最好放到同一目录下,注意路径中不含中文
https://github.com/opencv/opencv/releases
https://github.com/opencv/opencv_contrib/releases/
其中build 是自己建立的
cmake重编译
点击右侧“Browse Source”按钮输入OpenCV源码所在路径
点击右侧“Browse Build”输入生成的OpenCV工程存放目录
点击左下角Configure按钮,配置编译器
cmake 新版本(3.14.3)
cmake 老版本(3.9.0)
再一次点击Configure
注意输出栏会出现“CUDA detected 10.1”
修改红底色配置项
勾选 | ||
---|---|---|
WITH_CUDA | WITH_QT | WITH_OPENGL |
OPENCV_ENABLE_NONFREE | WITH_OPENCL_SVM | WITH_TBB (VS2015可选) |
BUILD_EXAMPLES (可选,创建openCV实例) |
BUILD_opencv_world (可选,所有库变成一个) |
不要勾选 | ||
---|---|---|
Build_CUDA_STUBS | ENABLE_PRECOMPILED_HEADERS |
同时需要修改…(你源码解压路径)\opencv-4.1.0\modules\videoio\src下文件“cap_Dshow.cpp”,修改是在“#include “cap_dshow.hpp”(在第45行)前加宏定义“#define NO_DSHOW_STRSAFE”,如下图所示:
配置opencv_contrib的文件路径
…(你源码解压路径)\opencv_contrib-4.0.1\modules
再一次点击Configure
配置Qt/TBB的路径
QT配置如下:
如QT5Test_DIR E:/program/Qt5.11.2/5.10.0/msvc2017_64/lib/cmake/Qt5Concurrent
TBB配置如下:
如:TBB_ENV_INCLUDE E:/program/tbb/tbb2019_20190320oss/include
再一次点击Configure。
配置CUDA架构版本
网上查询显卡对应架构版本,==CUDA_GENERATION== 选择对应架构版本
再一次点击Configure,直至没有红底色栏出现。
再检查一下之前的勾选项,点generate生成MakeFile文件
点Open project打开项目文件
VS后续操作
1.权限
以==管理员的身份==打开项目(你自定义的文件里),因为编译过程可能会出现需要系统授权才能访问的文件
2.测试
Cmake完成之后,==不要全部编译==。先选择==opencv_cudaarithm,opencv_cudabgsegm==这两个项目编译,因为这两个项目编译起来非常慢而且最容易出问题。在项目上 右键->生成,当这些文件都没有问题时,正式生成所有库文件。
3.正式开始生成
打开项目后, 点击“生成”-》“批生成”-》勾选install的“debug”和”release”,同时生成两个版本~
时间较长。
如果全部编译完毕之后,如果有一两个项目没有编译成功,没必要再全部重新编译。只需要在VS侧边栏的“解决方案资源管理器”找到对应的项目重新生成就行了(各种库生成失败,可以看看文章后面“==vs生成过程中的问题==”)。
openCV环境配置以及测试
生成成功后,将 E:\program\opencv\msvc410\install\x64\vc15\bin 添加入 path
VS的网上有 :https://blog.csdn.net/qq_41175905/article/details/80560429
QT mvsc版如下:
环境变量 path 添加:E:\program\opencv\msvc410\install\x64\vc15\bin (里面是dll动态链接库)
新建QT项目,套件为 mvsc 2017 64bit (因为openCV4.1.0只能用64位的)
.pro文件内添加open’CV环境
1 | #openCV |
main.cpp
1 |
|
遇到的问题
1.CUDA版本与显卡驱动不适配
运行示例时出现的错误提示
1 | cudaGetDeviceProperties returned 35 |
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html从该网站可以得到对应版本要求,进行更换或升级显卡驱动
2.编译openCV-cuda模块出现如下问题
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_cublas_LIBRARY (ADVANCED)
CUDA_npps_LIBRARY (ADVANCED)
1 | 我看了github上的解决方案, 就是编译器选择 vs 15 2017 win64 (cmake的版本为3.9.0,最新版没有该选项),就不会出现CUDA_cublas_LIBRARY (ADVANCED)CUDA_npps_LIBRARY (ADVANCED)了。 |
但是会出现CUDA_nppi_LIBRARY (ADVANCED),这个网上有修改的方案。大佬说是CUDA9.0版本不支持2.0架构,我觉得CUDA10.1估计也是。
首先找到 FindCUDA.cmake
参考文章:
https://blog.csdn.net/u014613745/article/details/78310916
(1)跟着上面大佬的步骤改就是了。
(2)最后一步添加头文件的文件路径变了
E:\program\openCV4.1.0\opencv-4.1.0\modules\core\include\opencv2\core\cuda
..(解压的地址)\opencv_contrib-4.1.0\modules\cudev
\include\opencv2\cudev\common.hpp
(3)文件OpenCVDetectCUDA.cmake中
set(_generations “Fermi” “kepler” “Maxwell” “Pascal”)中”Fermi”去掉
3.VS2017与VS2015的区别
重点是使用CMAKE编译时CUDA_HOST_COMPILER项的选择,正常更改的路径如下:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\cl.exe
当时安装VS2017时,没有把所有的东西都安装在C盘,所以我的路径是
E:/program/VisualStudio/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe
参考文章:
https://blog.csdn.net/baidu_33310451/article/details/89456480
若还是出现该问题,更换openCV版本 -》 4.0.1(我就是..)
4.VS生成过程中的问题
1.生成cuda_imgcodec.lib时
(1)error : dynamic initialization is not supported for a constant variable
解决方案:https://answers.opencv.org/question/205673/building-opencv-with-cuda-win10-vs-2017/
对E:\program\openCV4.0.1\opencv-4.0.1(openCV源码路径)\modules\core\include\opencv2\core\cuda\detail\color_detail.hpp 文件中96-127行“const” 修改为“constexpr” (2)E0282 全局范围没有 “max”/“min” opencv_core E:\program\openCV4.0.1\opencv-4.0.1\modules\core\include\opencv2\core\cuda\detail\color_detail.hpp 1614
解决方案:双击该错误,跳转至错误行,在::前添加std
int ix = std::min(std::max(int(x), 0), n-1);
2.生成cuda_arithm.lib时
(1)template instantiation resulted in unexpected function type of “std::true_type (std::integral_constant<__nv_bool, false> )” (the meaning of a name may have changed since the template declaration – the type of the template is “std::true_type (std::is_same<std::decay<decltype((
(2)name followed by “::” must be a class or namespace name opencv_cudaarithm e:\program\opencv4.0.1\opencv-4.0.1\modules\core\include\opencv2\core\cvstd_wrapper.hpp 52
(3)incomplete type is not allowed opencv_cudaarithm e:\program\opencv4.0.1\opencv-4.0.1\modules\core\include\opencv2\core\cvstd_wrapper.hpp 45
总算找到了解决方案:VS2017的VC编译器版本过高
(1)首先下载V14.11的工具集
启动VS intall ,点击对应2017版本“更多”下的“修改” ,选择“单个工具‘,安装V14.11的工具集。
(2)根据官网https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html#variable:CMAKE_GENERATOR_TOOLSET cmake-gui的生成器参数设置方法,设置VS的VCv14.11的工具集
参考文章:
https://blog.csdn.net/hybtalented/article/details/80434075?tdsourcetag=s_pctim_aiomsg
https://blog.csdn.net/ewqapple/article/details/81974210
1 | 按他们所说的修改方式,我在cmake-gui中配置的时候出错了。 |
——下面是按参考文章的做法—-
更改默认Visual Studio 2017 VC 工具链
打开 C:\Program Files (x86)\Microsoft Visual Studio\2017
\Community\VC\Auxiliary\Build(默认安装目录)
而我的在 E:\program\VisualStudio\VC\Auxiliary\Build
修改Microsoft.VCToolsVersion.default.props 、Microsoft.VCRedistVersion.default.txt、Microsoft.VCToolsVersion.default.txt的读写权限
右键 属性->安全
其中Microsoft.VCToolsVersion.default.props修改了也没用,那我们直接以管理员的身份运行该文件
桌面菜单栏右键”任务管理器”-》文件-》运行新任务
将以上三个文件内VS默认编译工具链修改为 14.11.25503 (一般后缀名为.props 的文件是VC工具集的配置文件)
备注一下:
VS原始默认工具集版本
VCToolsVersion 14.16.27023
VCToolsRedistVersion 14.16.27012
现在默认
VCToolsVersion 14.11.25503
VCToolsRedistVersion 14.11.25325
E:\program\VisualStudio\VC\Auxiliary\Build\
生成opencv_cvv.lib
在stringutils.cpp 出现“常量中有换行符” 等错误
解决方案:用==记事本==打开“stringutils.cpp” ,另存为 “UTF-8”格式覆盖原来的文件,再重新生成“opencv_cvv”
参考文献:http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html#commentform
5.QT使用cuda版open’CV出现的错误
:error: C1083: 无法打开包括文件: “cuda_runtime.h”: No such file or directory
E:\program\opencv\msvc410\install\include\opencv2\core\cuda\common.hpp:46
双击错误信息,引入cuda_runtime.h所在的绝对路径