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“
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
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