ich habe mich vor 2 Wochen beigemacht und eine kleine Bildverarbeitung begonnen.
Das Pythonscript bekommt eine PNG zugespielt. Bildaufnahme von der Kamera, Screenshot oder was auch immer.
Ich habe zum testen ein 8x8,1280x800, 1920x1280.
Ausgelesen habe ich das Bild in mehrere Varianten:
getpixel und 2 geschachtelte For Schleifen. Beim mittlersten Bild betrug die Scanzeit(jedes Pixel auslesen und in ein String gepackt, ohne Verarbeitung)-300 Sekunden
Mit der pix Variante 180 Sekunden.
Getdata, braucht 20 Sekunden zum laden der Tuples in ein numpy array.
Das durchlaufen des Arrays 1024000 braucht ewig. Mit RGBW=str(array[1])y habe ich nach kurzer Zeit abgebrochen. Unzumutbar.
sprintf kam auf 120 Sekunden.
Um ein Fehler auszuschliessen, habe ich einfach mal nur test_string="000:255:128:255" durchlaufen lassen. Selbst das brauch 90 Sekunden.
Meine Geduld und die Motivation ist am Ende.
Es gibt einmal das Bild, original_Bild und in diesen Bild wird Muster_Bild gesucht.
Meine Ansaetze waren jetzt folgende:
1. Ganze PNG wird in for Schleifen durch laufen. Sollte ein Scan Pixel mit den ersten Pixel aus dem Muster uebereinstimmen, vergleicht das Programm die Pixel 1:1.. Solang es Treffer gibt geht es weiter. Ist das Musterbild komplett vorhanden, wird die Position zurueckgegben.
2. Es wurde rechts und unten die Height und Width des Musterbilds abgezogen, als kleine Optimierung. Leider ohne merkbaren Unterschied. 10 Sekunden oder so.
3. Gesamte Bild als Array geladen und die Werte in Strings gepackt. Dauerte 29 Minuten bis ein Bild gefunden. Ok das Muster wurde auch gezielt sehr schwer gewaehlt.
4. Pix in ein definierten Bereich(200,200,600,600), damit nur 400x400 gescanned werden muss. Problem an der Sache, ist das Suchmuster ausserhalb, wird ein unbearbeitetes Bild ausgegben.
Die Bereichsbeschraenkung habe ich nur bei pix oder getpixel, getestet.
Bei den Array war es ein kleiner Zwischenschritt mit crop. Leider mit den oben genannten Problem.
Nach 2 Wochen und unzaehligen Stunden in Google und versuchten Optimierungen habe ich das heute hingeworfen und mich in C++ beigemacht.
Mit lodev und Frust, kam nach knapp 45 Minuten die gleiche Funktion wie in Python raus. Fuer das mittlerste Bild lag, die Zeit bei 32 Sekunden. Ebenfalls unzumutbar.
Allerdings ohne Optimierungen und schlechten Code 4x schneller.
Python soll doch die Uebersprache sein, schnell zu lernen, idiotensicher und plattformuebergreifend. Ich hab eher Frust, allein dieses daemliche Intend System.
in c++ gibt es sowas tolles
Code: Alles auswählen
for (int a=0;a<=10;a++)
{
cout<<"Integer"
<<a
<<endl;
}
Also was hab ich falsch gemacht? 30 Sekunden und 120 Sekunden sind ja nun unterschiedliche Zahlen.
Code: Alles auswählen
#for current_pixel_x in range (scan_range_x_start,full_pixel,1):
#if kanal_dest == 3:
#r,g,b=raw_pixel_list[(current_pixel_x)]
#if kanal_dest==4 :
#r,g,b,w=raw_pixel_list[(current_pixel_x)]
#test_string=("{3} :: {0}:{1}:{2}".format(r,g,b,current_pixel_x))
Das ganze laeuft auf ein Raspberry Pi B@900Mhz.
Ziel ist eine Bildbearbeitung in einer adequaten Zeit. 30 Sekunden waere ok. Ansonsten dauert eine Bearbeitung einer Bildserie, laenger als der Intervall bis zur naechsten Bildserie.
Mir ist bewusst, das ich noch einiges mehr beruecksichtigen muss. Zb. eine Abweichung von 10 % mit einbinden. Damit minimale Beleuchtungsaenderungen, abgefangen werden.
Anwendungen gibt es viele, Webcam Bilder bearbeiten, simple Kennzeichenerkennung, Smartphone und Tablet Ueberwachung(Screenshotserien erstellen per ADB zb.) Alarmausloesungen bei abweichenden Bildern in ein gewissen Intervall. Erfassung und Auswertung analoger Messdaten.
Aber dafuer muss es erstmal akzeptabel performant werden.
Python ist deswegen die Wahl geworden, da ich mich beruflich auch mit Python in Zukunft beschaeftigen werden muss und es bestimmt nicht schlecht ist, eine so offene Sprache zu lernen. RAD pur. Zudem kann auch eine kleine Anpassung mal eben erfolgen, ohne grosses neukompilieren usw. .