Credit: topbots.com

How to install OpenCV 4.2.0 with CUDA 10.1 on Ubuntu 20.04 LTS (Focal Fossa)

Shitty Bots
4 min readMay 8, 2020

--

Recently we were doing a project on computer vision where we needed to use OpenCV with CUDA. Now in order to do so we needed to download OpenCV source code from their Github, compile and build the models on our system.

As usual we went to google searched “How to build OpenCV with CUDA”, and after hours of searching we got few results which was kind of what we needed. But the main problem was that none of them were tested on the current environment specifications as in nobody had any tutorials for Ubuntu 20.04 which had the completely new Linux 5.4 kernel. As a result of which when we tried to follow them we encountered a lot of errors and simply couldn’t get the job done.

So one of our member Pritthijit Nath took the task of solving this conundrum, and did all the hard work and successfully built OpenCV 4.2.0 with CUDA 10.1 on Ubuntu 20.04 LTS (Focal Fossa).

Hence we decided to share with you guys the detailed steps for doing so… and spare you the days of debugging sessions, hours of nail biting infront of the monitor and much more.

Here’s Pritthijit’s gist which lists all the steps, go ahead and feel free to star him if this had helped you.

TL;DR : Use the script provided in the gist, change the directories as per your system and you will be good to go.

For your convenience we have also listed the steps here… so follow along

Install updates and upgrade your system:

$ sudo apt update
$ sudo apt upgrade

Install required libraries:

  • Generic tools:
$ sudo apt install build-essential cmake pkg-config unzip yasm git checkinstall
  • Image I/O libs
$ sudo apt install libjpeg-dev libpng-dev libtiff-dev
  • Video/Audio Libs — FFMPEG, GSTREAMER, x264 and so on.
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libavresample-dev $ sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev $ sudo apt install libxvidcore-dev x264 libx264-dev libfaac-dev libmp3lame-dev libtheora-dev  $ sudo apt install libfaac-dev libmp3lame-dev libvorbis-dev
  • OpenCore — Adaptive Multi Rate Narrow Band (AMRNB) and Wide Band (AMRWB) speech codec
$ sudo apt install libopencore-amrnb-dev libopencore-amrwb-dev
  • Cameras programming interface libs
$ sudo apt-get install libdc1394-22 libdc1394-22-dev libxine2-dev libv4l-dev v4l-utils $ cd /usr/include/linux $ sudo ln -s -f ../libv4l1-videodev.h videodev.h $ cd ~
  • GTK lib for the graphical user functionalites coming from OpenCV highghui module
$ sudo apt-get install libgtk-3-dev
  • Python libraries for python3:
$ sudo apt-get install python3-dev python3-pip $ sudo -H pip3 install -U pip numpy $ sudo apt install python3-testresources
  • Parallelism library C++ for CPU
$ sudo apt-get install libtbb-dev
  • Optimization libraries for OpenCV
$ sudo apt-get install libatlas-base-dev gfortran
  • Optional libraries:
$ sudo apt-get install libprotobuf-dev protobuf-compiler $ sudo apt-get install libgoogle-glog-dev libgflags-dev $ sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

We will now proceed with the installation (see the Qt flag that is disabled to do not have conflicts with Qt5.0).

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.2.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.2.0.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip
$ echo "Create a virtual environtment for the python binding module"
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip
$ echo "Edit ~/.bashrc"
$ export WORKON_HOME=$HOME/.virtualenvs
$ export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
$ source /usr/local/bin/virtualenvwrapper.sh
$ mkvirtualenv cv -p python3
$ pip install numpy
$ echo "Procced with the installation"
$ cd opencv-4.2.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_C_COMPILER=/usr/bin/gcc-8 \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D WITH_TBB=ON \
-D BUILD_opencv_cudacodec=OFF \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=1 \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_PYTHON3_INSTALL_PATH=~/.virtualenvs/cv/lib/python3.8/site-packages \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.2.0/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
-D BUILD_EXAMPLES=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=7.5 ..

If you want also to use CUDNN you must include those flags (to set the correct value of CUDA_ARCH_BIN you must visit https://developer.nvidia.com/cuda-gpus and find the Compute Capability CC of your graphic card) and also specify the CUDNN location:

-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=7.5 \
-D CUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so.7.6.5 \
-D CUDNN_INCLUDE_DIR=/usr/local/cuda/include \

Before the compilation you must check that CUDA has been enabled in the configuration summary printed on the screen. (If you have problems with the CUDA Architecture go to the end of the document).

--   NVIDIA CUDA:    YES (ver 10.1, CUFFT CUBLAS NVCUVID FAST_MATH)
-- NVIDIA GPU arch: 30 35 37 50 52 60 61 70 75
-- NVIDIA PTX archs:

If it is fine proceed with the compilation (Use nproc to know the number of cpu cores):

$ nproc
$ make -j8
$ sudo make install

Include the libs in your environment

$ sudo /bin/bash -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig

If you want to have available OpenCV python bindings in the system environment you should copy the created folder during the installation of OpenCV.

(-D OPENCV_PYTHON3_INSTALL_PATH=~/.virtualenvs/cv/lib/python3.8/site-packages) into the dist-packages folder of the target python interpreter:

$ sudo cp -r ~/.virtualenvs/cv/lib/python3.8/site-packages/cv2 /usr/local/lib/python3.8/dist-packages$ echo "Modify config-3.8.py to point to the target directory" 
$ sudo nano /usr/local/lib/python3.8/dist-packages/cv2/config-3.8.py
```
PYTHON_EXTENSIONS_PATHS = [
os.path.join('/usr/local/lib/python3.8/dist-packages/cv2', 'python-3.8')
] + PYTHON_EXTENSIONS_PATHS
```

If you were successful then Congratulations! But if you faced some problems do let us know, we will try our best to solve the issue.

Contact

Website : www.shittybots.ml

References

[1] raulqf
[2] pyimagesearch
[3] learnopencv
[4] Tzu-cheng
[5] Medium

--

--

Shitty Bots

A group of tech-enthusiasts from university level working on self-designed and sometimes inspired projects under self-guidance and sometimes professional guide.