Farbmittelwert aus Video-Stream


dsNDesign

Erfahrenes Mitglied
Hallo zusammen,

Ich habe in meinem Raspberry Pi einen Videostream als Eingangssignal. Aus diesem Stream möchte ich nun etwa 20-30 mal in der Sekunde den Farbmittelwert berechnen, um diese Farbe in RGB-LEDs zu aktivieren.
Da ich recht neu in der RPi / Phyton Programmierung bin, frage ich mich nun, wie ich das am Besten mache.

Hat jemand ein paar Tipps für mich?

Viele Grüße
 

sheel

I love Asm
Hi

klappt das Einlesen selber? Wie / in welchem Format hat man die Daten im Programm?

Kannst du die LED-Farbe setzen, unabhängig vom Video?
 

dsNDesign

Erfahrenes Mitglied
Noch habe ich kein Programm. Der Videostream funktioniert aber. Der Eingang liegt auf /dev/video0.
Die LED-Farbe kann ich mit dem Programm pi-blaster setzen, da die einzelnen Kanäle (RGB) auf die GPIO-Pins gelegt sind. Diesen kann ich dann einen Wert zwischen 0 und 1 geben.

Ich bin mir noch nicht sicher, ob ich überhaupt mit Python bei meinem Vorhaben richtig bin.
 

sheel

I love Asm
Also meine Meinung geht zu C++, aber das muss nichts heißen, das ist bei mir nämlich zu oft so :D

Fürs Einlesen könnte zB. http://linuxtv.org/downloads/v4l-dvb-apis/ ganz hilfreich sein,
/dev/videoX einfach als Datei zu behandeln und Byte zu lesen ist eher nicht drin
(bzw. schon möglich aber dann wirds komplexer, und nur Lesen ist vermutlich auch nicht genug)

Den Farbdurchschnitt bei einem vorhandenen Bitmapbild zu berechnen ist relativ einfach, nur ein paar Schleifen usw.

Und für die GPIOs zB. hier Beispiele und eine Klasse zum Zugriff:
http://hertaville.com/2012/11/18/introduction-to-accessing-the-raspberry-pis-gpio-in-c/


Für Python zB. hier Tipps zum Videoeinlesen:
http://stackoverflow.com/questions/13936607/options-to-read-webcam-using-python-linux
 

Technipion

Erfahrenes Mitglied
Hallo dsNDesign,
Ich bin mir noch nicht sicher, ob ich überhaupt mit Python bei meinem Vorhaben richtig bin.
Auf jeden Fall! Grundsätzlich lässt sich sagen, dass du jedes Software-Projekt in jeder Sprache umsetzen kannst. Allerdings besticht Python durch seine hohe Modularität, die dir - gerade wenn du viele verschiedene Bibliotheken in einem relativ "kleinen" Projekt benötigst - das Leben sehr erleichtern kann.
Sheel tendiert natürlich zu C++, schließlich ist er darin Profi und weiß wie man damit das letzte bisschen Performance aus dem Prozessor rauskitzelt :D. Ich kann dir auch sagen, dass das Programm welches du schreiben möchtest in C++ bestimmt schneller laufen würde als in Python. Die Frage ist allerdings, ob du dir den Aufwand antun willst, für einen Performancegewinn von vielleicht 15-20 %...
Dazu kommt noch: Wenn du dein Programm in Python schreibst (so, dass es zuverlässig läuft) und dann trotzdem die Performance noch steigern möchtest, gibt es auch dafür zahlreiche Möglichkeiten. In dem Fall könntest du einfach noch mal hier nachfragen ;).

Aber nun zu einem Ansatz, der auf Python beruht (was ja auf dem Raspberry PythonInterpreter nicht ganz abwegig ist :cool:):
Ich habe vor ein paar Monaten auf meinem Pi auch mit ner Webcam herumgespielt, dabei fand ich diese Seite hier sehr hilfreich:
https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/image_processing/
Du wirst dir das Python-Modul imgproc allerdings zuerst auf deinem Pi installieren müssen, dafür gibt es eine Installationsanleitung:
https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/downloads/#packages

Wie du auf der Seite des ersten Links siehst, brauchst du gerade einmal 6 Zeilen Code um ein Bild auszulesen und anzuzeigen. Unten auf der Seite sind auch noch weitere Beispiele zu finden, in denen gezeigt wird wie man einzelne Pixel ausliest. Im Prinzip musst du genau das machen: Alle Pixel auslesen und den dominanten Farbton bestimmen.

Wenn du den bestimmt hast, kannst du deine LED-Farbe per Pi-Blaster setzen. Hier ist ne nette Seite dazu:
http://42.oliver-bunte.de/2014/12/04/raspberry-software-pwm-pi-blaster/
Im Prinzip läuft es darauf hinaus, dass du die Schaltzustände der Pins in die Datei /dev/pi-blaster schreibst. Falls du noch nicht weißt, wie man in Python in Dateien schreibt ist hier die Referenzseite:
https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files

Grundsätzlich schadet ein solides Grundwissen in Python natürlich nicht ;). Zumindest die Basics der Sprache sollten sitzen, aber da Python wirklich leicht zu Erlernen ist, reicht hierfür allemal learning by doing.
Du hast jetzt alles was du brauchst, um dir ein Python-Programm zusammenzubasteln, und falls du irgendwo nicht weiterkommen solltest kannst du dich ja wieder melden (oder du schreibst das Programm in C++, wie sheel es vorgeschlagen hat :D).

Hast du denn schon irgendwelche Erfahrungen mit C++, Python und/oder anderen Sprachen?
Gruß Technipion