opencv_GPU版本编译
1编译前准备:
电脑需先安装nvidia独立显卡驱动以及cuda. 此电脑配置如下:
显卡型号 | GTX1650 |
---|---|
显卡驱动版本 | Driver Version: 450.80.02 |
CUDA版本 | release 10.0, V10.0.130 |
现在opencv3.2以及OpenCV3.2_contrib, 下载地址: https://github.com/opencv ,下载后解压,将contrib模块放进opencv3.2文件夹里面.
2修改文件
编辑 /opencv-3.2.0/cmake/FindCUDA.cmake:
找到 find_cuda_helper_libs(nppi)
, 然后替换成下面的语句:
find_cuda_helper_libs(nppial)
find_cuda_helper_libs(nppicc)
find_cuda_helper_libs(nppicom)
find_cuda_helper_libs(nppidei)
find_cuda_helper_libs(nppif)
find_cuda_helper_libs(nppig)
find_cuda_helper_libs(nppim)
find_cuda_helper_libs(nppist)
find_cuda_helper_libs(nppisu)
find_cuda_helper_libs(nppitc)
找到 set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")
替换成:
set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")
找到:unset(CUDA_nppi_LIBRARY CACHE)
替换成:
unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)
编辑: /opencv-3.2.0/cmake/OpenCVDetectCUDA.cmake
找到
...
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "2.0")
elseif(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
...
替换成
...
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
elseif(CUDA_GENERATION STREQUAL "Maxwell")
set(__cuda_arch_bin "5.0 5.2")
...
找到 set(__cuda_arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1")
替换成 set(__cuda_arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
编辑:opencv-3.2.0/modules/cudev/include/opencv2/cudev/common.hpp
增加下面的头文件:#include <cuda_fp16.h>
3 编译安装
拷贝下面命令的时候-D CUDA_ARCH_BIN=7.5 需根据自己电脑的配置来修改(一定要加这个选项,要不然编译出来的库没办法使用), 例如我的电脑显卡是GTX1650(查询网址:https://developer.nvidia.com/cuda-gpus),算力为7.5,因此这里填写的是7.5.
cd opencv-3.2.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/media/kfr/新加卷/opencv-3.2.0/opencv_contrib-3.2.0/modules -D CUDA_ARCH_BIN=7.5 -D WITH_CUDA=ON -D WITH_TBB=ON -D WITH_V4L=OFF -D WITH_LIBV4L=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_QT=OFF -D WITH_NVCUVID=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF ..
make -j8
sudo make install
4简单测试
在文件夹下创建文件 opencv_cuda_test.cpp以及CMakeLists.txt.文件内容如下:
opencv_cuda_test.cpp内容:
#include <iostream>
#include <ctime>
#include <cmath>
#include "bits/time.h"
//#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudaimgproc.hpp>
#define TestCUDA true
int main()
{
std::clock_t begin = std::clock();
try {
cv::Mat srcHost = cv::imread("../1.png",CV_LOAD_IMAGE_GRAYSCALE);
for(int i=0; i<1000; i++) {
if(TestCUDA) {
cv::cuda::GpuMat dst, src;
src.upload(srcHost);
//cv::cuda::threshold(src,dst,128.0,255.0, CV_THRESH_BINARY);
cv::cuda::bilateralFilter(src,dst,3,1,1);
cv::Mat resultHost;
dst.download(resultHost);
} else {
cv::Mat dst;
cv::bilateralFilter(srcHost,dst,3,1,1);
}
}
//cv::imshow("Result",resultHost);
//cv::waitKey();
} catch(const cv::Exception& ex) {
std::cout << "Error: " << ex.what() << std::endl;
}
std::clock_t end = std::clock();
std::cout << double(end-begin) / CLOCKS_PER_SEC << std::endl;
}
CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.4)
project(cuda_test)
find_package(OpenCV 3 REQUIRED)
find_package(CUDA 10 REQUIRED)
include_directories(
${OpenCV_DIR}
${CUDA_INCLUDE_DIRS}
)
if (NOT CUDA_FOUND)
message(STATUS "CUDA not found. Project will not be built.")
endif(NOT CUDA_FOUND)
# GTX1650显卡算力为 7.5 查询网址:https://developer.nvidia.com/zh-cn/cuda-gpus
SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_75,code=sm_75;-std=c++11;)
LINK_DIRECTORIES(/usr/lib
/usr/local/lib)
add_executable(opencv_cuda_test opencv_cuda_test.cpp)
target_link_libraries( opencv_cuda_test ${OpenCV_LIBS} ${CUDA_cudadevrt_LIBRARY})
然后 编译运行, cmake . && make && ./opencv_cuda_test,能正常编译通过并且运行说明GPU版本的opencv安装成功.
参考链接
https://stackoverflow.com/questions/46584000/cmake-error-variables-are-set-to-notfound