Um bestimmte Bereiche in Bildern zu erkennen, kann es hilfreich sein, diese per Farben zu selektieren. Ein Raspberry Pi ist für solch eine Farberkennung wunderbar geeignet, da er einerseits eine einfache Kameraschnittstelle hat und dazu sehr schnell per Python programiert werden kann.
OpenCV ist dafür eine großartige Bibliothek für alle möglichen Teile der Computer Vision (CV). Es bietet eine Reihe von einfachen Tools, die wir auf dem Raspberry Pi dank Python-Bibliothek nutzen können.
Übrigens: Auch dieses Tutorial ist aufgrund einer der vielen Raspberry Pi Tutorial-Wünsche entstanden.
Zubehör
Dieses Tutorial ist weitestgehend Software-basierend. Daher funktioniert es auch auf anderen Systemen mit Python – nicht nur auf dem Raspberry Pi. Da wir uns aber auf den Pi konzentrieren, empfehle ich ein Modell mit etwas mehr Leistung (mindestens Model 3B). Zusätzlich ist eine Webcam, oder auch die offizielle Raspberry Pi Kamera ideal:
- Raspberry Pi (das Modell ist egal, aber ein USB Anschluss sollte vorhanden sein oder der CSI Port ist frei)
- Offizielle Raspberry Pi Kamera
- oder: USB Webcam
Vorbereitung und Installation von OpenCV
Falls du ein echtes Bild der Kamera analysieren willst, so kannst du dies entweder auf Knopfdruck machen, oder aber per Software.
In jedem Fall brauchen wir aber OpenCV für Python. Falls du es bereits vorher installiert hast, kannst du einfach zum nächsten Punkt springen. Falls nicht, öffne deine Konsole und gib folgendes ein:
sudo apt-get update sudo apt-get install python3-dev python3-opencv --yes
Um es zu prüfen kannst du nun python3
eingeben und anschließend:
1 2 |
import cv2 print(cv2.__version__) |
Dies sollte die aktuelle OpenCV Version ohne Fehlermeldung ausgeben. Mit exit()
beendest du die Python-Konsole.
Skript zur Farberkennung am Raspberry Pi
Um die Farberkennung gut testen zu können, ist es wichtig, dass wir ein entsprechend farbiges Bild haben. Hierfür kannst du ein beliebiges Bild nehmen, oder eben z.B. das Titelbild dieses Artikels. Dieses kannst du folgendermaßen herunterladen:
wget https://tutorials-raspberrypi.de/wp-content/uploads/opencv_color.jpg
Nun werden wir das Skript erstellen, mit dem wir die Farberkennung starten:
sudo nano opencv_color_detection.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# -*- coding: utf-8 -*- import numpy as np import cv2 img_path = "/home/pi/opencv_color.jpg" ranges = { "red": ([0, 0, 128], [60, 60, 255]), # B G R "yellow": ([0, 190, 210], [128, 255, 255]), # B G R # many more } image = cv2.imread(img_path) # Alternative #cam = cv2.VideoCapture(0) #check, image = cam.read() for key in ranges.keys(): lowerRange = np.array(ranges[key][0], dtype="uint8") upperRange = np.array(ranges[key][1], dtype="uint8") mask = cv2.inRange(image, lowerRange, upperRange) output = cv2.bitwise_and(image, image, mask=mask) # show the images cv2.imshow(key, output) cv2.waitKey(0) cv2.destroyAllWindows() |
Führen wir das Skript also direkt aus und schauen, was passiert:
python3 opencv_color_detection.py
Du wirst folgende zwei Bilder zu sehen bekommen:
Übrigens: In dem obigen Code ist auch ein alternativer Teil eingebaut, falls du das Bild der Raspberry Pi Kamera nutzen willst. Du kannst z.B. auch auf Knopfdruck ein Bild aufnehmen und die Farberkennung dann auf diesem neuen Bild laufen lassen.
Erklärung des Codes
Die angebenen Farben befinden sich im BGR-Farbraum. Dieser ist äquivalent zum RGB Farbraum, jedoch sind die Positionen der Rot- und Grünwerte vertauscht.
Es ist unwahrscheinlich, dass ein Objekt immer genau eine Farbe hat. Daher nimmt man auch kleine Abweichungen in Kauf. Das ist der Grund, weshalb wir hier einen Farbbereich (von .. bis ..) angeben und alle Farben, die dazwischen liegen, z.B. zu der Farbe „rot“ zuordnen. In unserem konkreten Beispiel bedeutet das:
Alle Farben, die einen Blau-Wert zwischen 0 und 60, sowie einen Grün-Wert zwischen 0 und 60 und einen Rot-Wert von 128 bis 255 haben, werden zur Farbe „Rot“ zugeordnet. Gleiches gilt für die definierte Farbe Gelb.
Wir bilden also eine Maske auf das Bild, in der wir nur jene Pixel in diesem Farbbereich selektieren. Anschließend werden alle anderen Farben ausgeblendet (Schwarzer Bereich).
Es ist natürlich genauso möglich, mehrere Masken übereinander zu legen und z.B. alle roten und gelben Bereiche zusammen zu selektieren.
8 Kommentare
Dieser Befehl funktioniert bei mir nicht. „sudo apt-get install python3-dev python3-opencv –yes“ Es gibt nur die Fehlermeldung „Packet python3-opencv kann nicht gefunden werden“. Auch andere Schreibweisen von OpenCV werden nicht erkannt
Versuch es mal mit
sudo apt-get install python-opencv
oder alternativ über pip.Danke, hat funktioniert, aber es wurde nur opencv für Python 2.7 installiert. Weder pip3 noch apt erkennt opencv3.
Vielen Danke für die Anleitung, hat ohne Probleme geklappt.
hätte noch eine kurze Frage ist es möglich aus einem Livestream die Fraben zu erkennen?
Wenn ja wie sieht der grobe Programmaufbau aus?
Hallo zusammen,
bin neu hier. Ich lese nun einige Zeit diese Tutorials von Felix und möchte mich erstmal recht herzlich bei Felix bedanken. Speziell hat dieses Tutorial mein Projekt
Farberkennung erheblich weitergebracht.
MfG
Xaver
Hallo Ich habe alles so wie du gemacht jedoch, wenn ich das Python Script ausführe, passiert gar nichts
Den alternativ Teil habe ich weggelassen den Pfad zum Bild habe ich auch angepasst Jedoch erscheint kein Bild so wie bei dir was mach ich falsch
Ich denke es ist besser die Quelle zu runterladen und alles neu kompilieren.
Hier ein Hilfe:
https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/
Damit bekommt man die volle Version.
könnte man damit auch z.B. die Farbe eines Autos bestimmen? Die großen Lackkonzerne bieten spezielle Scanner für mehrere 1000 Euro an. Ist die Farberkennung gut genug um z.B. den Autolack eindeutig zu identifizieren? Also 5 Scannungen = 5x das gleiche Ergebnis?