1) 环境说明
操作系统: windows 10 IDE: vs 2017 编译工具: CMake 3.17.2
原始数据:opencv 4.3.0 源码 + opencv 4.3.0 contrib + cuda 10.2
2) 原始资料准备:(默认安装 vs 2017)
2.1 CMake 下载: https://cmake.org/download/
按需下载,采用cmake-3.17.2-win64-x64.zip。
2.2 opencv 4.3 以及 contrib 4.3
opencv -- github 资源: https://github.com/opencv/opencv/releases
opencv -- contrib 资源: https://github.com/opencv/opencv_contrib/releases
2.3 cuda 10.2
cuda 资源: https://developer.nvidia.com/cuda-downloads
按照的自己电脑配置进行选择: 我的配置是win10 + x64
2.4 tbb (一定要装,如果不装,cmake可以构建成功,但是vs构建opencv工程时,会报错。说是安装,下载资源解压到指定目录即可)【目录结构可见下方】
tbb 资源: https://github.com/oneapi-src/oneTBB/releases
3)顺序安装:
3.1) 默认已安装好 vs 2017
3.2) 安装下载好的 cuda 10.2 (cuda 是仅支持NVIDIADIA 显卡) :
参考 :https://www.cnblogs.com/arxive/p/11198420.html
自动添加cuda路径到计算机系统路径:
3.3) cmake 3.17.2 最重要的勾选下列选项 --
参考:https://blog.csdn.net/u011231598/article/details/80338941
3.4 ) 上述工作准备完毕 -- 最重要部分: opencv + opencv_contrib + cuda 编译
3.4.1 准备存储文件夹,为了方便构建,我放在E盘下的opencv4.3文件下,目录结构如下所示:(路径避免中文字符,可以减少很多不必要的麻烦):
3.4.2 cmake 打开
source code 选择我们设置的opencv 源码路径 -- where to build the binaries 路径是我们需要构建工程的输出目录,这边我在同级目录下直接构建opencv-4.3.0-build文件夹,作为我工程的输出目录。
这时 我们点击 左下方的 Configure 按钮,如果你没有预先构建build目录,会询问是否构建目录,选择是即可;接下来会显示选择编译器: 根据自己的本机 c++ IDE选择,我这边选择 2017版本。
在Optional platform for generator, 我们选择x64; (因为cuda 版本我选择了x64位,否则在后续编译时,会出现contrib 模块无法连接到 target module 下的cuda文件错误。我在这里耽误了一些时间,最后在stackflow上找到原因,请选择 x64)
点击finish 按钮,cmake 开始更新选项。
完成后,会出现如下很多的选项,接下来按需要选择 我们所需要的选项。
从上往下,选择勾选 BUILD_EXAMPLES、取消勾选BUILD_PREF_TESTS和BUILD_TESTS、(如果需要将所有的模块打包成一个模块,勾选BUILD_opencv_world, 这边建议勾选,使用时只加载一个lib即可)、设置OPENCV_EXTRA_MODULES_PATH,选择我们防止opencv_contrib源码位置的modules文件。如下图:
再次点击configure 看下面输出有没有报错: 这边一般会出现两种情况:
1)这11个文件下载报错。E:\opencv-4.3\opencv-4.3.0-build\CMakeFiles查看CMakeError.log 或者 build下的CMakeDownloadLog.txt查看网址,直接到github上下载放在E:\opencv-4.3\opencv-4.3.0\.cache\xfeatures2d下的对应目录下,你会发现文件夹下有对应文件,但是文件夹为0KB,你需要将自己下载的文件 重命名 覆盖文件。(命名按照0KB文件同名命名覆盖)【其他相同文件缺失也可按照此方法进行对应版本文件替换,CSDN也有资源文件,就是需要币】
2) 这个face模块下文件较大,日常下载失败,人脸模块我也用不到,故我选择不勾选该模块。
3)通过筛选,tbb,勾选 WITH_TBB,点击 configure ,设置Tbb的环境路径。
设置tbb环境路径:点击 configure 即可。
cuda 勾选, 点击 configure
可以 https://developer.nvidia.com/cuda-gpus 查看自己GPU的CUDA_ARCH_BIN 参数减少configure时间。我的是1050 ,填写 6.1 即可。
最后点击Generate生成项目,没有错误,通过Open Project 使用VS 2017 打开构建build下的OpenCV.sln项目。
生成ALL_BUILD 和 INSTALL 项目 -- 右键生成。大约 2-3小时后生成项目(with CUDA的编译特别慢)
一切顺利没有报错,可以在build的路径下找到你生成的lib文件,即可配置使用了。(有错误可以查找对应错误,重新生成)
4) 项目测试
需要配置一下 系统环境变量:Path (项目运行时所需要的dll文件)
CMakeLists.txt
cmake_minimum_required (VERSION 3.0)
project (ReconStruct)
set(PROJECT_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
set(PROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
#OpenCV include
set(OpenCV_INCLUDE_DIR E:/opencv-4.3/opencv-4.3.0-build/install/include)
#Eigen include
set(EIGEN_INCLUDE_DIR "E:/opencv-4.3/eigen-3.3.7/")
#CUDA include
set(CUDA_INCLUDE_DIR "E:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include")
include_directories(
${PROJECT_INCLUDE_DIR}
${OpenCV_INCLUDE_DIR}
${EIGEN_INCLUDE_DIR}
${CUDA_INCLUDE_DIR}
)
message("source foleder is : ${OpenCV_INCLUDE_DIR}")
#openCV lib
set(OpenCV_LinkLib_DIR E:/opencv-4.3/opencv-4.3.0-build/install/x64/vc15/lib)
#CUDA lib (使用""包含空格path)
set(CUDA_LinkLib_DIR "E:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/lib/x64")
link_directories(
${OpenCV_LinkLib_DIR}
${CUDA_LinkLib_DIR}
)
# opencv 的依赖库
link_libraries(opencv_world430 opencv_world430d cublas cuda cudadevrt cudart cudart_static OpenCL)
add_executable(ReconStruct src/main.cpp)
target_link_libraries(ReconStruct ${OpenCV_LinkLib_DIR})
主函数: main.cpp
#include
#include
#include
#include
#include
#include "cuda_runtime.h"
#include
using namespace std;
using namespace cv;
int main()
{
clock_t t1 = clock();
Mat src_host = imread("E:/hello.png");
imshow("src", src_host);
cuda::GpuMat src, gray;
cv::imshow("src", src_host);
src.upload(src_host);
cuda::cvtColor(src, gray, COLOR_BGR2GRAY);
Mat gray_host;
gray.download(gray_host);
imshow("src", src_host);
imshow("gray", gray_host);
clock_t t2 = clock();
std::cout << "time :" << (t2 - t1) / 1000 << "s" << endl;
/*cv::cuda::printCudaDeviceInfo(cuda::getDevice());
int count = cuda::getCudaEnabledDeviceCount();
printf("GPU Device Count : %d \n", count);*/
waitKey(0);
return 0;
}
使用GPU进行图片颜色转灰度。
至此,opencv + cuda 环境配置完成。
感谢相关博客主:
https://blog.csdn.net/qq_37791134/article/details/80739395
https://www.cnblogs.com/asmer-stone/p/5530868.html
https://blog.csdn.net/qq_41180014/article/details/91467890