Im Bereich des maschinellen Sehens gewinnen embedded Lösungen zunehmend an Bedeutung. Diese bauen in aller Regel auf dem MIPI-CSI Standard (MIPI für Mobile Industry Processor Interface, CSI für Camera Serial Interface) auf, welcher ursprünglich im Bereich der Smartphones entwickelt wurde. Auch dort ging es um eine einheitliche Schnittstelle zwischen Bildsensor und board. Diese Schnittstelle erlaubt eine direkte Kommunikation mit dem ISP (image signal processor, das „Herz“ des Sensors) des Bildsensors mittels I2C Bus, die Daten werden von diesem getrennt seriell im GHz-Bereich übertragen. Heute gibt es eine Vielzahl von embedded Boards, welche MIPI CSI unterstützen.
Auf der „Empfängerseite“ werkelt in der Regel (embedded) Linux. Umso wichtiger war hier auch eine Weiterentwicklung der Standard-APIs für die Bild- und Videoverarbeitung. V4L2 war langsam in die Jahre gekommen. Hersteller von industriellen Bildsensoren für den embedded Bereich stricken ihre eigenen Frameworks, die inkompatibel zueinder stehen. Von dieser Sichtweise gerade noch rechtzeitig betrat libcamera das Licht dieser Welt. Seine Wurzeln liegen (mal wieder) bei der Firma Nokia. Diese wollte ursprünglich ein Plugin-basiertes Softwareprojekt zur Kameraunterstützung erstellen. Das Projekt wurde jedoch abgebrochen, da die Entwicklung von Linux-basierten Smartphones eingestellt wurde. Die Ansätze sind aber dermaßen gut, dass sie neuen Schwung in die Entwicklung der Bild- und Videoschnittstellen von Linux brachten und bringen.
Videostreams stellen hohe Anforderungen sowohl an die Geschwindigkeiten der Busse als auch an die Rechengeschwindigkeit der die Streams verarbeitenden Einheiten. Gerade im embedded Bereich müssen dafür Hard- und Software „Hand in Hand“ arbeiten. So arbeitet bereits als erste „Intelligenz“ der Image Signal Processor (ISP) direkt auf dem Bildsensor oder später die Vision Processing Unit (VPU) auf dem SoC. Libcamera ist von seinem Design darauf zugeschnitten.
Im Raspberry Pi OS wird libcamera standardmäßig „mit ausgeliefert“. Arducam gehört zu den Herstellern, welche Bildsensoren auch für Raspberry Pi Boards entwickeln. Teile des Treibercodes von Arducam sind dabei bereits in Raspberry Pi OS eingeflossen. Libcamera besitzt eine Vielzahl von Algorithmen und Regelkreisen. Ein guter Einstiegspunkt ist der Raspberry Pi Camera Algorithm and Tuning Guide.
Zu den Standartalgorithmen zählen:
alsc | Automatic Lens Shading Correction algorithm. |
agc | Automatic Gain/Exposure Control algorithm (AGC/AEC). |
awb | Automatic White Balance algorithm (AWB). |
black_level | Algorithm to set the correct black level for the sensor. |
cac | Algorithm to mitigate colour fringing caused by lateral chromatic aberration. Pi 5 only. |
ccm | Algorithm to calculate the correct Colour Correction Matrix (CCM). |
contrast | Adaptive global contrast and gamma control algorithm. |
denoise | Algorithm to jointly control spatial denoise, temporal denoise and colour denoise. Pi 5 only. |
dpc | Algorithm to set the appropriate level of Defective Pixel Correction. |
geq | Algorithm to set an appropriate level of Green Equalisation. |
lux | Algorithm that estimates an approximate lux level for the scene. |
noise | Algorithm to calculate the noise profile of the image given the current conditions. |
sdn | Algorithm to set an appropriate strength for the Spatial Denoise block. Pi 4 and earlier devices only. |
sharpen | Algorithm to set appropriate sharpness parameters. |
af | Algorithm to control a lens driver for Auto Focus. |
Eine wichtige Rolle kommt dabei den Tuning-Files zu. Als Beispiel sei die Lens Shading Korrektur genannt. Lens Shading beschreibt Effekte bei Objektiven, die dazu führen, das sich die Helligkeit wie auch die Farbe vom optischen Zentrum des Bildsensors zu den Seiten ändert. Diese Effekte lassen sich einmessen und parametrisieren (siehe z.B. https://www.image-engineering.de/library/image-quality/factors/1073-shading). Diese Parameter können nun wieder mithilfe der Tuning Files gleich in den Bildbearbeitungsprozess übernommen werden. So bietet ArduCAM unter https://docs.arducam.com/Raspberry-Pi-Camera/Native-camera/Lens-Shading-json-file/ die entsprechenden Tuning Files zu ihren Linsen für IMX219 und IMX477 an. Gerade Lens Shading ist auch ein gutes Beispiel für Abhängigkeiten von geschlossenen Regelkreisen und Parametern, zum Beispiel in diesem Fall des Color shadings und des Weißabgleichs (AWB).
Für Eigenentwicklungen ist es nach meiner Erfahrung besser, libcamera selbst zu kompilieren. Die folgende Tabelle zeigt eine Auflistung der Repositorien. Im Fall von speziellen Bildsensoren von ArduCAM Bildsensoren (Arducam Pivariety camera solution) wie z.B. Globale Shutter Kameras empfiehlt sich der Einsatz des libcamera-Forks von ArduCAM. Dieser hängt dafür gerade bei Versionssprüngen dem Original oftmals etwas hinterher.
Ein sehr gutes Einführungsbeispiel für erste Programmierungen direkt auf libcamera ist https://git.libcamera.org/libcamera/simple-cam.git/tree/simple-cam.cpp. ACHTUNG: libcamera hat gerade erst die Version 0.2.0 erreicht. Daher gibt es zwischen Versionssprüngen noch immer wieder Änderungen in Kleinigkeiten wie namespaces etc. Auch daher muss die Version von libcamera-apps immer zur Version von libcamera passen bzw. muss man bei Versionssprüngen kleinere Codeanpassungen am eigenen Code vornehmen.
Ein weiterer guter Link zum Thema Implementation von ISP Algorithmen unter libcamera ist https://embedded-recipes.org/2023/schedule/implementing-isp-algorithms-in-libcamera/.
Die Raspberry Pi High Quality Camera mit dem 12,3MP IMX477 Sensor von Sony kommt mit C / CS-Mount. Die M12 / S-Mount Variante kommt mit einer Sonderlösung des S-Mount Halters, welcher die gleiche Platine nutzt:
Wer einen „normalen“ S-Mount-Halter benötigt, z.B. mit schaltbarem IR-Cut, der kann alternativ auf die HQ-Boards von ArduCAM ausweichen: https://www.arducam.com/product/arducam-12mp-imx477-mini-high-quality-camera-module-for-raspberry-pi. ACHTUNG: einzelne Boards machen dabei Probleme mit der automatischen Kameraerkennung unter Raspberry OS. In diesem Fall einfach dtoverlay=imx477
explizit in der config.txt setzen.