【并行开发】cuda+opencv+vs 在win10下混合编译GPU模块

环境配置

  • Visual Studio 2015(vs一定要在cuda之前装)
  • CUDA 10.1;安装时选择自定义安装,只勾选CUDA,不修改安装路径。
  • OpenCV 4.1.0+OpenCV-contrib 4.1.0
  • CMake 3.11 ,安装最后一步勾选Add CMAKE to the PATH for all users

reference

查看本机是否支持cuda开发 || 下载CUDA ToolKit || cuda安装教程 ||github-opencv


一、OpenCV+OpenCV Contrib库混合编译(with CUDA)

1.1 下载原材料

获取OpenCVOpenCV-Contrib库的源码(链接如上),两者注意选择同一版本,如opencv4.1.0,那么Contrib也要选择4.1.0。切记不要在github里直接选择Clone and download,那样版本会是最新的。注意后续配置全程退出360。

1.2 CMAKE编译

  • 打开cmake“Where is the source code"处选OpenCVsource文件夹,“where to”则选择库编译的目的文件夹
  • 选好后点左下角configure,如果目的文件夹不存在会提示新建,确定即可。
  • 关键一步,选择你的VS版本,一定要选择WIN64和 “use defalut native compilers" 。
  • 点左下角finish,等读条完成后出现一堆红色项目,且下方输出框也没有红色信息(download failed)时,即第一次编译成功。检查窗口下方的输出框是否有“CUDA detected:10.1”的信息,说明CUDA安装成功且被检测到。
  • 在红色堆堆里找OPENCV_EXTRA_MODULES_PATH,填写路径,就是你下载的opencv_contrib源码解压后存放的文件夹中的modules文件夹路径。
  • 在红色堆堆那个窗口中找WITH_CUDA,勾选它!这一步也有教程说勾选create opencv_world的选项,没必要,这个dll的作用就是一个替代N个, 尤其是在个人主机上跑的,后面很可能因为创建dll时链接过长失败。同样的,如果想缩短编译和重新生成解决方案的时间,建议将BUILD_EXAMPLES去除。
  • 再次点击左下角configureconfigure done且没有红色,且下方输出框也没有红色信息(download failed)时,即第二次编译成功
  • 点击generate,完成后会在目的文件夹生成VS项目。

两次编译成功前有一句且下方输出框也没有红色信息(*download failed*),,这是个巨大坑:下方信息框输出大量“download failed”,究其原因就是没有*的PCgithub下载一些辅助文件速度太慢失败。解决方案是自己到github-opencv 上对应模块下载文件,并放入相应文件夹中,具体参照了B站教程:OpenCV从入门到放弃

1.3 VS 生成动态库

  • CMAKE 结束后,可点击左下角Open Project,或打开目的文件夹找到对应sln文件打开编译好的项目。
  • VS里,“生成”->“配置管理器”->解决方案选择DEBUG,活动解决平台选择X64,勾选“ALL BUILD”和“INSTALL”,生成即可。或者在右侧解决方案中分别找到“ALL BUILD”和“INSTALL”,右键“仅生成”。
  • 生成成功后在目的文件夹下会出现一个INSTALL文件夹,路径“install/x64/vc14/”下的binlib两个文件夹内即生成的动态链接库文件。后续配置环境变量都要用到(lib是编译时用的,dll是运行时用的)。

重新生成过程中如果遇到提示“某个项目外部环境已更改”,选择全部重新加载即可。配置CUDA的情况下,重新生成解决方案的时间很长,一般都要2-3小时,渣一点的七八个小时也有,耐心等待。如果最后的生成结果缺少1-2个lib,直接到目的文件夹module目录下找到未成功的项目名称,打开对应的.sln重新生成解决方案,重新点击INSTALL即可。


二、配置opencv运行环境

2.1 配置系统环境变量

进入系统环境变量对话框,在PATH中添加生成的bin路径(1.3中的3步骤。)

2.2 VS2015包含库路径配置

  • 打开一个VS项目,上方工具栏“视图”-> “其他窗口”-> “属性管理器”,在DEBUG|X64版本下右键“属性”。

  • 添加包含目录:“VC++目录”-> “包含目录”-> 选择编辑,添加include文件夹,具体为“目的文件夹/install/include/”“目的文件夹/install/include/opencv2 (如果有的话) ”

  • 添加库目录: “VC++目录”-> “库目录”-> 选择编辑,添加路径“install/x64/vc14/lib”

  • 添加链接器宏定义:“链接器”->“输入”->“选择编辑”,手动敲入“install/x64/vc14/lib” 下的.lib名称。 这些库文件全是自己通过VS2015编译出来的。这个也是检查自己编译是否成功的标准,如果编译不成功,则没有库文件;编译成功则有需要的库文件。

那么问题来了,要手打多少个lib才是头呢? 善良笔者在线提供.py代码,帮助大家扒取文件名。

import os  
def file_name(file_dir):   
    for root, dirs, files in os.walk(file_dir):  
        print(root) #当前目录路径  
        print(dirs) #当前路径下所有子目录  
        print(files) #当前路径下所有非目录子文件

三、测试

测试OpenCV的GPU模块是否可以正确调用并启动GPU加速,测试代码如下:

//测试显卡方法1(此方法可以读取显卡型号)
cv::cuda::printShortCudaDeviceInfo(cv::cuda::getDevice());

//测试显卡方法2
int iDevicesNum = cv::cuda::getCudaEnabledDeviceCount();
cout << iDevicesNum << endl;

//测试显卡方法3
cv::cuda::DeviceInfo _deviceInfo;
bool _isDeviceOK = _deviceInfo.isCompatible();
std::cout << "IsGPUDeviceOK : " << _isDeviceOK << std::endl;`

如果抛出no cuda support的错误,可以将"目的文件夹/install/x64/vc14/bin"下的opencv_core410d.dll复制到CWindowssystem3264目录下。这一步笔者一直报错找不到某.dll文件,最后将全部的.dll复制过去才成功。

如果代码正常运行,恭喜你,混合编译生成OpenCVGPU模块到此结束~


附录

笔者的.lib目录:

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_features2d410d.lib opencv_flann410d.lib opencv_fuzzy410d.lib opencv_gapi410d.lib opencv_hfs410d.lib opencv_highgui410d.lib opencv_imgcodecs410d.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

【并行开发】cuda+opencv+vs 在win10下混合编译GPU模块

上一篇:API文档


下一篇:Delphi GetLastError - 取最后的错误