OpenCV auf dem Raspberry Pi installieren

OpenCV ist ein Computer Vision Bibliothek und läuft unter Windows, Linux als auch macOS. Es wurde in C++ geschrieben, dementsprechend kann es dort inkludiert werden. Aber auch Python und Java werden von der Bibliothek unterstützt. Viele benutzen OpenCV zur Gesicht-, Gesten- und Objekterkennung, um nur einige zu nennen. In diesem Beitrag gehe ich auf die Installation ein. Auch wenn ich dies auf dem Raspberry Pi 3 mache, so ist die Routine auf anderen Debian-Derivaten ähnlich. Auf dem Pi3 läuft zurzeit Raspbian Stretch. Welche Version ihr habt, könnt ihr mit folgenden Befehl überprüfen:

pi@raspberrypi3:~ $ grep VERSION_CODENAME /etc/os-release
VERSION_CODENAME=stretch

OpenCV Installation

Zu unterscheiden sind hier 2 Installationsweisen. Die pip3-install Variante ist die schnellste, ist aber abhängig von den Maintainern des Repositories, wo das Packet geladen wurde. Mit anderen Worten, es könnte nicht aktuell sein oder einige benötigte Packages fehlen. Trotzdem sollte diese Variante nicht abgeschrieben werden. Sie reicht für die meisten privaten Projekte und das kompilieren von OpenCV hat viele Fallstricke.

pip3 installation

Wie schon erwähnt, ist diese Installation relativ einfach. Gebt dazu folgende Zeile in eurem Terminal ein:

sudo pip3 install opencv-contrib-python

Die, zu diesem Zeitpunkt aktuellste Version im Repository, ist die 4.4.0.46. Laut der offiziellen OpenCV Seite ist 4.5.0 die Aktuellste und müsste dementsprechend auf dem PI kompiliert werden. Falls ihr ein pip3 search opencv ausgeführt habt, so ist ebenfalls ein Package opencv-python zu finden. Der Unterschied ist, dass bei der contrib Versionen mehr Funktionen enthalten sind, daher ziehe ich die contrib Version der Standard vor.

OpenCV eigenständig kompilieren

Für die eigene Kompilierung müssen wir einige Packages selber holen und opencv von github beziehen.

Fangen wir an und laden uns die benötigten Entwicklungstools wie Cmake:

sudo apt update
sudo apt upgrade
sudo apt-get install build-essential cmake pkg-config

Zusätzlich benötigen wir I/O Packages um Video- und Bilddateien auf dem System zu lesen, bzw. vom Video Stream.

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev

Die folgenden Packages sind hilfreich und sollten ebenfalls mit installiert werden.

sudo apt-get install libfontconfig1-dev libcairo2-dev
sudo apt-get install libgdk-pixbuf2.0-dev libpango1.0-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran

Numpy sollte, falls nicht schon längst geschehen, installiert werden.

sudo pip3 install numpy

Damit hätten wir die erforderlichen Packages installiert. Wir können uns nun die aktuellste Version von openCV, Stand heute(05.12.2020) ist es die Version 4.5.0, aus dem Github Repository holen und entpacken.

wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
unzip opencv.zip
unzip opencv_contrib.zip

Anders als bei der pip3 Installation benötigen wir für die Contrib Installation auch die Standard Version. OpenCV installieren wir mit der Standard, geben beim Build die Contrib Version allerdings mit an.

Bevor wir nun weitermachen, ist es sinnvoll den SWAP zu erhöhen. Standardmäßig ist dieser auf 100MB begrenzt. Wir sollten vor der Kompilierung dem Raspberry erlauben 2048 MB vom Arbeitsspeicher auf der SD Karte auszulagern. Dafür muss in /etc/dphys-swapfile der FLAG CONF_SWAPSIZE auf 2048 geändert werden.

sudo vi /etc/dphys-swapfile
CONF_SWAPSIZE=2048
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

Wenn dieser gesetzt ist, können wir mit der Kompilierung weiter machen. Wechselt nun in das entpackte opencv Verzeichnis und legt ein neuen Ordner an. Diesen benötigen wir beim „Build“ Prozess, daher nennen wir ihn auch Build.

cd opencv-4.5.0/
sudo mkdir build
cd build

Nun können wir das Build konfigurieren. Achtet darauf, dass ihr auch wirklich im Build Ordner seid.

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.5.0/modules \
-D ENABLE_NEON=ON  \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_ENABLE_NONFREE=OFF \
-D CMAKE_SHARED_LINKER_FLAGS=-latomic \
-D BUILD_EXAMPLES=OFF ..

In OPENCV_EXTRA_MODULES_PATH gebt ihr den Pfad zu dem contrib Ordner an. Mit NEON und VFPv3 stellt ihr sicher, dass das Kompilieren schneller läuft und dass OpenCV für ARM Prozessoren optimiert wird. Falls ihr noch Beispiele für Python haben wollt, könnt ihr den FLAG INSTALL_PYTHON_EXAMPLES auf ON setzen. Die Konfigurierung dauert nun etwas. Danach wird eine Übersicht angezeigt, mit den Einstellungen die getroffen wurden.

-- General configuration for OpenCV 4.5.0 =====================================
--   Version control:               unknown
--
--   Extra modules:
--     Location (extra):            /home/pi/opencv_contrib-4.5.0/modules
--     Version control (extra):     unknown
--
--   Platform:
--     Timestamp:                   2020-12-03T19:48:35Z
--     Host:                        Linux 4.19.66-v7+ armv7l
--     CMake:                       3.7.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
--
--   CPU/HW features:
--     Baseline:                    VFPV3 NEON
--       requested:                 DETECT
--       required:                  VFPV3 NEON
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ standard:                11
--     C++ Compiler:                /usr/bin/c++  (ver 6.3.0)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-psabi -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-psabi -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/cc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-psabi -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-psabi -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections  -mfpu=neon -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -latomic  -Wl,--gc-sections -Wl,--as-needed
--     Linker flags (Debug):        -latomic  -Wl,--gc-sections -Wl,--as-needed
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor mcc ml objdetect optflow phase_unwrapping photo plot python2 python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 alphamat cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv hdf java js julia matlab ovis sfm viz
--     Applications:                perf_tests apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:
--     GTK+:                        YES (ver 3.22.11)
--       GThread :                  YES (ver 2.50.3)
--       GtkGlExt:                  NO
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.8)
--     JPEG:                        /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver 62)
--     WEBP:                        /usr/lib/arm-linux-gnueabihf/libwebp.so (ver encoder: 0x0209)
--     PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.6.28)
--     TIFF:                        /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 / 4.0.8)
--     JPEG 2000:                   build (ver 2.3.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      YES
--       avcodec:                   YES (57.64.101)
--       avformat:                  YES (57.56.101)
--       avutil:                    YES (55.34.101)
--       swscale:                   YES (4.2.100)
--       avresample:                NO
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Lapack:                      NO
--     Eigen:                       NO
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.5.1)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/pi/opencv-4.5.0/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.13)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython2.7.so (ver 2.7.13)
--     numpy:                       /usr/local/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.4)
--     install path:                lib/python2.7/dist-packages/cv2/python-2.7
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.3)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.5m.so (ver 3.5.3)
--     numpy:                       /usr/local/lib/python3.5/dist-packages/numpy/core/include (ver 1.16.4)
--     install path:                lib/python3.5/dist-packages/cv2/python-3.5
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:
--     ant:                         /usr/bin/ant (ver 1.9.9)
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv-4.5.0/build

Falls Fehler aufgetaucht sind, müsst ihr diese natürlich vorher beheben. Da der Konfigurierungs-Prozess erfolgreich verlief, starten wir die Kompilierung. Ihr könnt es gerne ausprobieren, alle 4 Cores dabei zu benutzen.

sudo make -j4

In meinem Fall hat dies leider immer dazu geführt, dass der Raspberry dauerhaft abgestürzt ist. Erst als ich die Cores auf 1 reduziert hatte. Lief der Prozess komplett durch. Bei der Kompilierung müsst ihr Geduld mitbringen, denn die kann Gut und Gerne mal 4 Stunden dauern.

sudo make -j1

Ist die Kompilierung soweit erfolgreich abgeschlossen, geht es ans Installieren von OpenVC.

sudo make install

Nach der Installation dürft ihr nicht vergessen den SWAP wieder zu reduzieren, da es sonst zu Schäden auf der SD Karte kommen kann.

sudo vi /etc/dphys-swapfile
CONF_SWAPSIZE=100
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

Überprüft, ob OpenCV korrekt installiert ist und ermittelt die Versionsnummer.

pi@raspberrypi3:~/opencv-4.5.0/build $ opencv_version
4.5.0

Mit den zuvor installierten Python Beispielen könnt ihr einige Tests machen. Die Beispiele liegen im Ordner /usr/local/share/opencv4/samples/

3 Gedanken zu „OpenCV auf dem Raspberry Pi installieren

  1. Hallo, Danke für die herforragende Anleitung, habe alles genau eingehalten jedoch nach starten von „Python“ und Eingabe von „import cv2“ kommt

    ModuleNotFoundError: No module named ‚cv2‘

    An was kann das liegen ? Danke

    1. Hallo,

      scheinbar hat die Installation nicht ganz geklappt.
      Bei der cmake Ausgabe, ist der angegebene Python dein aktueller? Gibt es einen für python2 und python3? Welcher Version ist bei dir in Verwendung? Was gibt der Befehl „opencv_version“ aus?
      Ist dieser überhaupt aufrufbar? – Falls nicht scheint die Installation nicht erfolgreich gewesen zu sein. Sollte dieser funktionieren, so besteht ein Problem mit dem Python-Modul. Der Python Interpreter könnte unter umständen dann nicht die korrekten Dateien finden, da sie für eine andere Pythonversion installiert wurde.

      Viele Grüße
      stevie

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert