First of all install update and upgrade your system:
$ sudo apt-get update
$ sudo apt-get upgrade
Then, install required libraries:
-
Developers tools:
$ sudo apt-get install build-essential cmake pkg-config unzip yasm git gfortran
-
Image I/O libs
$ sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
-
Video Libs - FFMPEG, GSTREAMER, x264 and so on.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev $ sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev $ sudo apt-get install libxvidcore-dev x264 libx264-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev
-
Cameras programming interface libs
$ sudo apt-get install libdc1394-22 libdc1394-22-dev libxine-dev libv4l-dev v4l-utils
-
GTK lib for the graphical user functionalites coming from OpenCV highghui module
$ sudo apt-get install libgtk-3-dev
-
Python libraries for python2 and python3:
$ sudo apt-get install python-dev python-pip python3-dev python3-pip $ sudo -H pip2 install -U pip numpy $ sudo -H pip3 install -U pip numpy
-
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).
$ git clone https://github.com/opencv/opencv.git
$ cd opencv
$ git checkout 3.4.1
$ cd ..
$ git clone https://github.com/opencv/opencv_contrib.git
$ cd opencv_contrib
$ git checkout 3.4.1
$ cd ..
$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_QT=OFF ..
If you want to build the libraries statically you only have to include the -D BUILD_SHARED_LIBS=OFF
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_QT=OFF -D BUILD_SHARED_LIBS=OFF ..
(In case you do not want to include include CUDA:)
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=OFF -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D WITH_QT=OFF -D BUILD_SHARED_LIBS=OFF ..
Before the compilation you must check that CUDA has been enabled in the configuration summary printed on the screen.
-- NVIDIA CUDA
-- Use CUFFT: YES
-- Use CUBLAS: YES
-- USE NVCUVID: NO
-- NVIDIA GPU arch: 20 30 35 37 50 52 60 61
-- NVIDIA PTX archs:
-- Use fast math: YES
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
Verify the installation by compiling and executing the following example:
#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("image.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;
}
Compile and execute:
$ g++ `pkg-config opencv --cflags --libs` -o test test.cpp
$ ./test
If you have any problem try updating the nvidia drivers.
Cuda 9.0 only works with gcc & g++ vesion 6.0 and you likley have 7.0. So, you must install them and create the respective symlinks:
# CUDA 9 requires gcc 6
$ sudo apt install gcc-6
$ sudo apt install g++-6
# set up symlinks for gcc/g++
sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.3/modules -D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python -D WITH_QT=OFF -D BUILD_EXAMPLES=OFF -D INSTALL_C_EXAMPLES=OFF -D INSTALL_PYTHON_EXAMPLES=OFF -D CUDA_NVCC_FLAGS=--expt-relaxed-constexpr -D CUDA_GENERATION=Maxwell ..
Fixes
When compiling the test program, library includes must follow object that requires them:
OpenCV version 4.1.0
For OpenCV version 4.1.0, add the following to the
cmake
command line:-DBUILD_opencv_cudacodec=OFF -DOPENCV_GENERATE_PKGCONFIG=ON -DOPENCV_PC_FILE_NAME=opencv.pc
this will
In the test program:
change
CV_LOAD_IMAGE_GRAYSCALE
tocv::IMREAD_GRAYSCALE
References
opencv/opencv_contrib#1946
opencv/opencv#13154