PiBlobDetector

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Einführung

Blob-Detection anhand von Farben und Formen ermöglicht es Objekte zu erkennen und diese in einem Bild zu lokaliseren. Um den Blob-Detector möglichst vielseitig einsetzen zu können müssen gewisse Faktoren übereinstimmen:

  • Größe
  • Preis
  • Flexibilität
  • Robustheit
  • Einfacher Aufbau

Um diese Aspekte zu erfüllen, haben wir uns deshalb für einen Blob-Detector mittels eines Raspberry Pi Zero W entschieden. Dieser erfüllt alle geforderten Gesichtspunkte. Durch seine kleine Größe kann er fast überall im Raum angebracht werden. Für 20€ ist der Anschaffungspreis sehr günstig. Des Weiteren kann der Pi zusammen mit der Kamera in ein Gehäuse integriert werden, was die Hardware robust wie auch kompakt gegen äußere Einflüsse schützt.

Hardware Spezifikation

Raspberry Pi Zero W
  • Raspberry Pi Zero W
    • 1GHz
    • 512MB RAM
    • On-board Wireless LAN - 2.4 GHz 802.11 b/g/n (BCM43438)
    • On-board Bluetooth 4.1 + HS Low-energy (BLE) (BCM43438)
    • micro-SD
    • mini-HDMI
    • micro-B USB für Daten und Stromversorgung
    • 40-Pin GPIO Anschluss
    • Abmessung: 65 x 30 x 5mm


  • Pi Camera Module
    • Abmessung: 25 × 24 × 9mm
    • Auflösung: 5 Megapixel
    • Video Modi: 1080p30, 720p60 und 640 × 480p60/90


Der Raspberry Pi wird in der Regel mit Raspbian betrieben. Hierbei stellt Raspbian ein modifiziertes Debian Betriebssystem (GNU/Linux) dar. Das Betriebssystem wird auf einer SD-Karte installiert und kann durch den eingebauten WLAN-Chip über das Internet aktualisiert werden. Ein USB-OTG-Port ist ebenfalls vorhanden. Hier kann ein beliebiges USB-Gerät angeschlossen (bspw. auch ein USB-zu-Ethernet-Adapter).

Ziel

Zu Beginn des Praktikums bestand das Ziel aus einer Gesichtserkennung mittels der RaspberryPi-Cam. Der Algorithmus sollte sich hierbei ebenfalls auf dem Raspberry Pi befinden. Das automatisch erkannte Gesicht sollte mit einer Schaumstoffkanone, welche sich mittels USB steuern lässt, anvisiert und abgeschossen werden. Da wir im laufe der ersten Wochen feststellen mussten, dass die Arbeit mit OpenCV komplizierter als gedacht war, wurde das Projekt darauf begrenzt, einen Farb-Blob im Bild der RaspberryPi-Cam zu erkennen. Hierbei lag der Fokus auf der größtmöglichen Effizienz, da der RaspberryPi eine begrenze Rechenleistung aufweist.

Implememtierung

Algorithmus

Da ein OpenCV-Paket für den Raspberry Pi nicht offiziell verfügbar ist musste die Bibliothek erst für die spezielle ARM-Architektur übersetzt werden. Hierzu wurde ein Cross-Compiler auf dem Host-System eingerichtet. Das kompilierte Paket (für RasPi V1 inkl. Zero) wurde im OCS neben dem Source-Code ebenfalls abgelegt (siehe letzten Punkt dieser Wiki-Seite).

Für die eigentliche Programmierung wurde die Sprache C++ gewählt. Hierbei ist zu erwähnen, dass OpenCV hier auch weitere Programmiersprachen wie Java oder Python unterstützt. Das eingelesene Bild wird zu Beginn durch einen Gauß-Filter 'verwaschen'. Darauf folgend wurde mittels einer Konvertierung und geeigneter Parametrierung die Farbe im HSV-Farbraum erkannt. Die so erkannte Farbe wurde durch entsprechende Binarisierung extrahiert. Die resultierende binäre Maske wird anschließend über das originale Bild gelegt. Als letzten Schritt neben der Darstellung für den Benutzer wurde die ausgeschnittene, farbige Fläche durch einen Blob-Detector erkannt (mittels der Klasse SimpleBlobDetector). Die erkannte Fläche wird im Ergebnisbild entsprechend visualisiert.

Im allgemeinen wurde der Code zu Beginn auf einem Laptop mit ausreichender Rechenleistung getestet und erst im letzten Schritt auf den Raspberry Pi portiert. Um mit dem Pi zu kommunizieren wurde SSH verwendet. Die Bildschirmübertragung wurde mittels X-Forwarding realisiert.

Herausforderungen

  • Cross-Compilierung
  • Blob-Erkennung mit möglichst geringem Fehler
  • Effizienz auf RasPi

Ergebnisse

Prinzipiell läuft das Programm auf dem Raspberry Pi. Auf Grund der geringen Leistung des Raspberry Pi Zeros und der dazugehörigen PiCam ist die Latenzeit zwischen Aufnahme, Verarbeitung und Anzeige vergleichsweise sehr groß.

Folgende Bilder wurden mit der Kamera in einer Auflösung von 320x240 Pixeln aufgenommen. Das Bild "Original" wurde unbearbeitet abgespeichert. Das Bild "Blurred" stellt den Stand vor der Binarisierung/Blob-Detection dar. Das Ergebnis wird im Bild "Detected" dargestellt. Hier wurde der weniger interessante Bereich durch entsprechende Binarisierung entfernt.

Eine größere Auflösung der Bilder ist nicht sinnvoll, da mit der gewählten Auflösung der Raspberry Pi Zero sich bereits an seiner Leistungsgrenze bewegt.

Dateien

  • SourceCode der erstellten Anwendung
  • OpenCV in Version 3.4.1 mit Contrib-Modulen für Raspberry Pi 1 (inkl. Zero)