• 网上安装opencv有很多教程,但是一旦涉及到使用cuda加速的opencv DNN模型等,很多教程就毫无意义,opencv官网2.4k的issues也说明了其bug之多。

  • 本文是作者对opencv gpu源码编译的总结。

  • 参考教程(有些问题,但是大体思路不错):https://learnopencv.com/opencv-dnn-with-gpu-support/

源码编译过程

  1. 安装依赖。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install build-essential cmake unzip pkg-config
    sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
    sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
    sudo apt-get install libv4l-dev libxvidcore-dev libx264-dev
    sudo apt-get install libgtk-3-dev
    sudo apt-get install libblas-dev liblapack-dev gfortran
    sudo apt-get install python3-dev
    
  2. CUDA CUDNN安装。网上已经有很多教程,这里不再赘述。

    • 本文使用CUDA 11.6以及CUDNN 8.4.1。
    • 只要CUDA和CUDNN的版本匹配就好了,不需要卸载已经有的版本重新安装,后续源码编译CMakeLists.txt会自动检测最低要求的CUDA和CUDNN要求。
  3. 下载并解压opencv及opencv_contrib(注意这个路径,cmake编译时候需要使用)源码到home下:

    1
    2
    3
    4
    5
    
    cd ~
    wget -O opencv-4.7.0.zip https://github.com/opencv/opencv/archive/refs/tags/4.7.0.zip
    unzip -q opencv-4.7.0.zip
    mv opencv-4.7.0 opencv
    rm -f opencv-4.7.0.zip 
    
    1
    2
    3
    4
    
    wget -O opencv_contrib-4.7.0.zip https://github.com/opencv/opencv_contrib/archive/4.7.0.zip
    unzip -q opencv_contrib-4.7.0.zip
    mv opencv_contrib-4.7.0 opencv_contrib
    rm -f opencv_contrib-4.7.0.zip 
    
  4. 安装numpy:pip install numpy

  5. 源码编译opencv:

    1
    2
    3
    
    cd ~/opencv
    mkdir build
    cd build
    
    • 我习惯使用cmake-gui编译,可以更好的选择编译选项:
    1
    
    cmake-gui
    
    • 默认使用configure。

    • 设置OPENCV_EXTRA_MODULES_PATH为~/opencv_contrib/modules。

    • 勾选OPENCV_ENABLE_NONFREE,WITH_CUDNN,WITH_CUDA,WITH_CUBLAS,BUILD_EXAMPLES(如果勾选这个,我的经验是需要要按照#22245修改samples/cpp/CMakeLists.txt,不然会有bug:21804)等等。

    • configure以后再点击generate。

  6. 安装opencv(很慢,有时候会在某个选项卡很久。)

    1
    
    make -j `nproc` && sudo make install
    
  7. 建立软连接。

    1
    2
    3
    4
    
    # 本机python3.8的site-pakages
    cd /home/rzy/.local/lib/python3.8/site-packages
    # cv2.so文件安装位置
    ln -s /usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so cv2.so
    
  8. 现在opencv-gpu就已经安装好了。

C++,Python代码自动补全vscode设置

C++, Python cuda测试

  • 文件结构:

    1
    2
    3
    
    ├── CMakeLists.txt
    ├── main.cpp
    └── main.py
    
  • CPP测试:

    1
    2
    3
    4
    5
    
    mkdir build
    cd build
    cmake ..
    make
    ./main
    

  • Python测试:python3 main.py

C++测试代码

main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <opencv2/core/cuda.hpp>

using namespace std;
using namespace cv;
using namespace dnn;
using namespace cuda;

int main(int, char**) {

    printCudaDeviceInfo(0);

    cout << "Hello, world!\n";
}

CMakelists.txt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cmake_minimum_required(VERSION 3.0.0)
project(main)

include(CTest)
enable_testing()

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable(main main.cpp)

target_link_libraries( main ${OpenCV_LIBS} )

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

Python测试代码

1
2
3
import cv2
from cv2 import cuda
cuda.printCudaDeviceInfo(0)