OpenCV — установка 4.5.5 (под Linux)


Рассмотрим как установить последнюю версию 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)

Ссылки

По теме


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение