重编译openCV源码(4.1.0)with CUDA

起因

在利用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%

重启生效

检测是否安装成功

CUDA安装成功

显卡就绪

(以自带示例来测试)

命令行 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重编译

  1. 点击右侧“Browse Source”按钮输入OpenCV源码所在路径

  2. 点击右侧“Browse Build”输入生成的OpenCV工程存放目录

  3. 点击左下角Configure按钮,配置编译器

  4. cmake 新版本(3.14.3)

    cmake新版本

  5. cmake 老版本(3.9.0)

    cmake老版本

  6. 再一次点击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”,如下图所示:

cmake3

配置opencv_contrib的文件路径

…(你源码解压路径)\opencv_contrib-4.0.1\modules

cmake2

再一次点击Configure

配置Qt/TBB的路径

QT配置如下:

如QT5Test_DIR E:/program/Qt5.11.2/5.10.0/msvc2017_64/lib/cmake/Qt5Concurrent

cmake4

TBB配置如下:

如:TBB_ENV_INCLUDE E:/program/tbb/tbb2019_20190320oss/include

cmake5

再一次点击Configure

配置CUDA架构版本

网上查询显卡对应架构版本,==CUDA_GENERATION== 选择对应架构版本

cmake7

再一次点击Configure,直至没有红底色栏出现。

cmake6

再检查一下之前的勾选项,点generate生成MakeFile文件

success

Open project打开项目文件

VS后续操作

1.权限

以==管理员的身份==打开项目(你自定义的文件里),因为编译过程可能会出现需要系统授权才能访问的文件

vs3

2.测试

Cmake完成之后,==不要全部编译==。先选择==opencv_cudaarithm,opencv_cudabgsegm==这两个项目编译,因为这两个项目编译起来非常慢而且最容易出问题。在项目上 右键->生成,当这些文件都没有问题时,正式生成所有库文件。

vs4

3.正式开始生成

打开项目后, 点击“生成”-》“批生成”-》勾选install的“debug”和”release”,同时生成两个版本~

时间较长。

vs2

如果全部编译完毕之后,如果有一两个项目没有编译成功,没必要再全部重新编译。只需要在VS侧边栏的“解决方案资源管理器”找到对应的项目重新生成就行了(各种库生成失败,可以看看文章后面“==vs生成过程中的问题==”)。

openCV环境配置以及测试

生成成功后,将 E:\program\opencv\msvc410\install\x64\vc15\bin 添加入 path

yep

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
2
3
4
#openCV
LIBS += E:/program/opencv/msvc410/install/x64/vc15/lib/*.lib
INCLUDEPATH += E:/program/opencv/msvc410/install/include/ \
E:/program/opencv/msvc410/install/include/opencv2/

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "mainwindow.h"
#include <QApplication>

#include <opencv2/opencv.hpp>
#include <opencv2/core/version.hpp>
#include "opencv2/core/cuda.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/video.hpp"

#include "opencv2/cudalegacy.hpp"
#include "opencv2/cudaimgproc.hpp"
#include "opencv2/cudaarithm.hpp"
#include "opencv2/cudawarping.hpp"
#include "opencv2/cudafeatures2d.hpp"
#include "opencv2/cudafilters.hpp"
#include "opencv2/cudaoptflow.hpp"
#include "opencv2/cudabgsegm.hpp"

using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
//w.show();
// Mat dst = imread("更换你的图片路径");
// imshow("show",dst);
namespace GPU = cv::cuda;
// 首先要检查是否CUDA模块是否可用
if(GPU::getCudaEnabledDeviceCount()==0){
cerr<<"此OpenCV编译的时候没有启用CUDA模块"<<endl;
return -1;
}else{
cout<<"GPU enable :"<<GPU::getCudaEnabledDeviceCount()<<endl;
}

const int rows = 16*50;
const int cols = 16*60;
const int type = CV_8UC3;

// 初始化一个黑色的GpuMat
GPU::GpuMat gpuMat(rows,cols,type,Scalar(0,0,0));
// 定义一个空Mat
Mat dst;
// 把gpuMat中数据下载到dst(从显存下载到内存)
gpuMat.download(dst);
// 显示
imshow("show1",dst);
waitKey(1000);

// 读取一张图片
Mat arr = imread("更换你的图片路径");
imshow("show2",arr);
waitKey(1000);

// 上传到gpuMat(若gpuMat不为空,会先释放原来的数据,再把新的数据上传上去)
gpuMat.upload(arr);
// 定义另外一个空的GpuMat
GPU::GpuMat gray;
// 把gpuMat转换为灰度图gray
GPU::cvtColor(gpuMat,gray,0);
// 下载到dst,如果dst不为空,旧数据会被覆盖
gray.download(dst);
// 显示
imshow("show3",dst);
waitKey(0);
return a.exec();
}

遇到的问题

1.CUDA版本与显卡驱动不适配

运行示例时出现的错误提示

1
2
3
cudaGetDeviceProperties returned 35
-> CUDA driver version is insufficient for CUDA runtime version
CUDA error at C:/dvs/p4/build/sw/rel/gpgpu/toolkit/r10.1/demo_suite/bandwidthTest/![img](file:///C:\Users\Pabebe\AppData\Local\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)bandwidthTest.cu:255 code=35(cudaErrorInsufficientDriver) "cudaSetDevice(currentDevice)"

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)

cmake-bug

1
我看了github上的解决方案, 就是编译器选择 vs 15 2017 win64 (cmake的版本为3.9.0,最新版没有该选项),就不会出现CUDA_cublas_LIBRARY (ADVANCED)CUDA_npps_LIBRARY (ADVANCED)了。

cmake-bug-解决5

但是会出现CUDA_nppi_LIBRARY (ADVANCED),这个网上有修改的方案。大佬说是CUDA9.0版本不支持2.0架构,我觉得CUDA10.1估计也是。

首先找到 FindCUDA.cmake

cmake-bug-解决

参考文章:

https://blog.csdn.net/u014613745/article/details/78310916

(1)跟着上面大佬的步骤改就是了。

cmake-bug-解决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

cmake-bug-解决2

(3)文件OpenCVDetectCUDA.cmake中

set(_generations “Fermi” “kepler” “Maxwell” “Pascal”)中”Fermi”去掉

cmake-bug-解决3

3.VS2017与VS2015的区别

cmake-bug-解决4

重点是使用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

cmake-bug-解决6

参考文章:

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(())>::type, void>::type )”) opencv_cudaarithm e:\program\opencv4.0.1\opencv-4.0.1\modules\core\include\opencv2\core\cvstd_wrapper.hpp 49

(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编译器版本过高

VS编译器

(1)首先下载V14.11的工具集

启动VS intall ,点击对应2017版本“更多”下的“修改” ,选择“单个工具‘,安装V14.11的工具集。

VS编译器2

(2)根据官网https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_TOOLSET.html#variable:CMAKE_GENERATOR_TOOLSET cmake-gui的生成器参数设置方法,设置VS的VCv14.11的工具集

VS编译器b1

VS编译器b2

VS编译器b3

参考文章:

https://blog.csdn.net/hybtalented/article/details/80434075?tdsourcetag=s_pctim_aiomsg

https://blog.csdn.net/ewqapple/article/details/81974210

1
2
按他们所说的修改方式,我在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的读写权限

右键 属性->安全

VS编译器4

其中Microsoft.VCToolsVersion.default.props修改了也没用,那我们直接以管理员的身份运行该文件

桌面菜单栏右键”任务管理器”-》文件-》运行新任务

VS编译器5

将以上三个文件内VS默认编译工具链修改为 14.11.25503 (一般后缀名为.props 的文件是VC工具集的配置文件)

VS编译器3

备注一下:

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所在的绝对路径

QT

---------------- 本文结束 ----------------

本文标题:重编译openCV源码(4.1.0)with CUDA

文章作者:Pabebe

发布时间:2019年05月16日 - 20:35:14

最后更新:2020年06月16日 - 18:24:34

原始链接:https://pabebezz.github.io/article/3833e1c9/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%