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 ..
You have problems loading CUDA libraries when compiling the examples. Make sure you correctly installed CUDA or the linking process is looking at the correct place to find the libraries.