Рассмотрим как установить последнюю версию OpenCV из исходников под ОС Linux.
На время написания (апрель 2022) — последняя стабильная версия OpenCV — 4.5.5 ( релиз от 25 декабря 2021).
Установка из исходников может потребоваться — если захочется воспользоваться модулем dnn для запуска нейронных сетей с поддержкой CUDA (технология от Nvidia для параллельных вычислений на видеокартах).
На установке CUDA подробно останавливаться не буду, но сделаю небольшое замечание ниже.
Сама установка OpenCV состоит из нескольких простых шагов, которые приводятся в документации:
1. Установка требуемых программ для сборки:
sudo apt update && sudo apt install -y cmake g++ wget unzip
Если вы и так используете компьютер для разработки — то скорее всего это всё у вас и так уже установлено.
2. Установка требуемых библиотек:
В сети приводится вот такой список:
sudo apt-get install build-essential cmake pkg-config unzip yasm git checkinstall sudo apt-get install libjpeg-dev libpng-dev libtiff-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libavresample-dev sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev sudo apt-get install libxvidcore-dev x264 libx264-dev libfaac-dev libmp3lame-dev libtheora-dev sudo apt-get install libfaac-dev libmp3lame-dev libvorbis-dev sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get install libgtk-3-dev sudo apt-get install libtbb-dev sudo apt-get install libatlas-base-dev gfortran 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 sudo apt-get install libgtkglext1 libgtkglext1-dev sudo apt-get install libopenblas-dev liblapacke-dev libva-dev libopenjp2-tools libopenjpip-dec-server libopenjpip-server libqt5opengl5-dev libtesseract-dev
Не все эти библиотеки нужны и часть можно не ставить — просто при подготовке к сборке cmake будет говорить, что чего-то не хватает.
3. Скачивание и распаковка исходников OpenCV:
# Download and unpack sources wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip unzip opencv.zip unzip opencv_contrib.zip
Соответственно — здесь 4.x нужно заменить на 4.5.5
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip
4. Подготовка директории для сборки:
# Create build directory and switch into it mkdir -p build && cd build
5. Подготовка к сборке и сборка:
# Configure cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules ../opencv-4.x # Build cmake --build .
6. Установка:
sudo make install
По-умолчанию, файлы будут установлены в /usr/local/
/usr/local/bin — исполняемые файлы
/usr/local/lib — библиотеки (.so)
/usr/local/include/opencv4 — заголовочные файлы
/usr/local/cmake/opencv4 — cmake package
/usr/local/share/opencv4 — другие файлы (e.g. trained cascades in XML format)
Замечания
Если cmake почему-то не увидел CUDA или cuDNN,то придётся ему подсказать и принудительно указать, что мы хотим использовать CUDA:
cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda -D CUDNN_LIBRARY=/usr/lib/cuda/lib/libcudnn.so -D CUDNN_INCLUDE_DIR=/usr/lib/cuda/include -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.5/modules -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON ../opencv-4.5.5/ make -j8
Здесь требуется сделать несколько замечаний:
Если устанавливать cuDNN (версии 8) через deb-пакет, то он устанавливается в /usr/lib/x86_64-linux-gnu/ и при попытке сборки может выдавать ошибку вида:
Could NOT find CUDNN: Found unsuitable version “…”, but required is at least “7.5”
Оказывается, что в 8-й версии cuDNN из deb-пакета почему-то нет cudnn.h — и эту ошибку можно убрать либо создав ссылку на cudnn_version_v8.h:
sudo ln -s ./cudnn_version_v8.h ./cudnn.h
, либо скачать и установить cuDNN из архива (cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar.xz), содержимое которого скопировать в /usr/local/cuda
FAST_MATH
Во многих статьях рекомендуют в качестве параметров сборки указывать опцию -D ENABLE_FAST_MATH=1
Однако, необходимо иметь в виду, что эта опция включает оптимизацию
-ffast-math
Sets the options -fno-math-errno, -funsafe-math-optimizations, -ffinite-math-only, -fno-rounding-math, -fno-signaling-nans, -fcx-limited-range and -fexcess-precision=fast.
This option causes the preprocessor macro __FAST_MATH__ to be defined.
This option is not turned on by any -O option besides -Ofast since it can result in incorrect output for programs that depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however, yield faster code for programs that do not require the guarantees of these specifications.
Что может привести к непредвиденным и нежелательным последствиям при вычислениях на CPU.
Например, при использовании OpenCV, собранного с этой опцией — у меня возникли проблемы с выполнением модели нейронной сети через модуль dnn на центральном процессоре.
Симптомы были следующими: при работе на CUDA — всё работало как надо, но при попытке запуска на CPU — на выходе модели кроме нормальных данных — было ещё много nan.
Python
Если сборка OpenCV была выполнена с поддержкой python, то после установки пакет поставится в /usr/local/lib/python3.x/site-packages, где x — ваша версия питона.
Чтобы указать, что нужно брать пакет cv2 именно оттуда — нужно перед импортом этого модуля добавить в путь поиска данную директорию.
Например, так:
import sys sys.path.insert(0, '/usr/local/lib/python3.8/site-packages') #print(sys.path) import cv2 print(cv2.__version__)
Это может понадобиться если, опять-таки, захочется чтобы OpenCV-ный модуль dnn мог работать с CUDA.
Заключение
Установка завершена и остаётся собрать свою первую тестовую программу.
Для сборки можно использовать вот такой
Makefile
CC := g++ CFLAGS := -I/usr/local/include/opencv4 -L/usr/local/lib OBJECTS := LIBRARIES := -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_dnn -lopencv_videoio -lopencv_imgcodecs .PHONY: all clean all: test test: $(CC) $(CFLAGS) -o test test.cpp $(LIBRARIES)
Ссылки
- OpenCV — Installation in Linux
- opencv releases
- Compiling OpenCV with CUDA support
- How to Compile OpenCV 4.5.2 with CUDA 11.2 and cuDNN 8.1 on Ubuntu 20.04
По теме