![]() |
Webcam - Form/Zeiger/LED erkennen?
Hallo!
![]() ![]() Mein Ziel ist es, in einem Bild von meiner Webcam einen "Zeiger" zu finden, um dann z.B. etwas zeichnen zu können, indem man mit dem Zeiger in der Luft rumhantiert... :mrgreen: Das ganze muss noch recht schnell sein, da es ja live (mind. 5mal/sec) durchgeführt werden muss... Das Bild von der Webcam in mein Programm zu bekommen ist schon erledigt, aber das finden des "Zeigers" bereitet mir da noch so einige Schwierigkeiten... Mein aktueller Ansatz funktioniert zwar erstmal annäherungsweise, allerdings hoffe ich, dass jemand eine bessere Idee hat weil zuviele Störfaktoren im Moment einwirken. Wie man oben auf dem Bild sieht, hab ich einfach so eine Fahrrad-Lampe genommen...Dann wird im Programm per klick auf die Lampe die Farbe "gemessen" und gespeichert. Danach fange ich dann an, Pixel für Pixel jedes Webcam-Bildes in einer endlosschleife abzuscannen...und dann addiere ich von jedem Pixel die rot- grün- und blauwerte und vergleiche diese summe mit der summe der r/g/b werte der gemessenen Farbe, und wenn diese beiden Werte sich bis auf eine bestimmte Toleranzschwelle (z.b. 20) gleichen, dann wird gemeldet "hier ist der zeiger".... hier der code: (dabei werden noch jeweils 3 pixel zusammengefasst, um das Grundrauschen der webcam etwas zu minimieren)
Delphi-Quellcode:
das klappt aber nur extrem schlecht...die LED ist eigentlich weiß in der mitte, d.h. als zeiger wird jeder fast weiße pixel im Bild aufgefasst und das ist schlecht..sobald ich aber etwas wirklich rotes auswähle wird praktisch JEDER etwas dunklere Pixel als zeiger angenommen....das ist echt zum verzweifeln!
y:=0;
repeat y:=y+1; x:=0; i:=0; red:=0;green:=0;blue:=0; repeat x:=x+1; i:=i+1; c_frame:=pic.Pixel[x,y]; red := red + TColor32Entry(c_frame).R; green := green + TColor32Entry(c_frame).G; blue := blue + TColor32Entry(c_frame).B; if i=3 then begin red := round (red/3); green := round (green/3); blue := round (blue/3); if abs(red+green+blue-led_color_sum)<difference then begin led.X := x; led.Y := y; Result:=true; Break; end; red := 0; blue := 0; green := 0; i := 0; end; until (x>=w-2) or (Result=true); until (y>=h-2) or (Result=true); Kann mir vielleicht irgendjemand helfen? Vielleicht eine andere Art, diese Toleranzschwelle einzubauen? Oder ein ganz anderer "Zeiger" (statt meiner roten led?) bin für jegliche Hilfe dankbar.... |
Re: Webcam - Form/Zeiger/LED erkennen?
Hi!
Du kannst nicht einfach die Farben addieren. clRed hat 255,0,0 -> 255+0+0 = 255 clGreen hat 0,255,0 -> 0+255+0 = 255 clBlue hat 0,0,255 -> 0+0+255 = 255 bei allen drei Farben kommt 255 als Ergebnis raus, aber es sind VÖLLIG unterschiedliche Farben. Vergleiche lieber die Farbwerte einzeln... Chris |
Re: Webcam - Form/Zeiger/LED erkennen?
Ansonsten würde ich vorschlagen die Koordinaten der LED nicht auf den Pixel zu setzen, in dem gerade mal ein Pixel gefunden wurde.
Ich würde das auch nicht über eine Endlosschleife machen. Eventuell wäre es besser, sich das akutalle Bild von der Kamera zu holen und dann Punkt für Punkt zu vergleichen (beachte dabei CK_CKs Anmerkung :wink: ). Von allen Punkten, die in Frage kommen, sollte man dann den Mittelpunkt bilden - oder jedenalls ein Punkt, der dem Mittelelpunkt recht nahe kommt - und diesen dann als LED-Koordinaten nehmen. Erst wenn das alles durch ist, würde ich das nächste Bild von der Cam holen und wieder von vorne anfangen. Wie man den Leuchtepunkt sonst finden sollte, weiß ich auch nicht wirklich. Aber eventuell kannst du ja beim Einschalten des Programms ein Referenzbild holen, auf dem nichts drauf ist; nur der Hintergrund. Dann kann man eventuell schneller die Änderungen finden und muss nur noch diese nach einem hellen Punkt untersuchen... Aber solange, wie das zeitlich passt, würde ich den ersten Weg einschlagen. |
Re: Webcam - Form/Zeiger/LED erkennen?
hm...das klingt schonmal gut (mit dem Mittelpunkt) aber da ist immernoch das Problem, dass halt auch des öfteren Pixel mit der richtigen Farbe völlig woanders sind, weil fast alle sehr hellen Pixel angenommen werden wenn ich das mit der LED mache...
und die Sache mit den Farbwerten mach ich schon einzeln, keine Angst ;) also ich addiere den rot, grün und blau-anteil eines Pixels... Es funktioniert ja auch leidlich wenn der Hintergrund keine ähnliche Farbe wie die LED aufweist ( bei mir ist die rote LED ja nun im Zentrum weiß, und der Hintergrund ist überall doch relativ dunkel) aber das ist eben wie gesagt nich so das wahre... Und das mit der Endlosschleife ist vielleicht auch dämlich ausgedürckt, ich mach das schon so, das ich immer erst ein Bild mache, dann dieses Bild durchscanne, dann das nächste Bild mache usw... EDIT: achja nochwas - es ist gar nicht so wichtig das genau der Zeiger gefunden wird..also es kann auch eben nur ein Pixel am Rand der LED sein, hauptsache es ist dann immer derselbe....was ich eben erreichen will ist das malen oder evt. auch die Maus bewegen... |
Re: Webcam - Form/Zeiger/LED erkennen?
Also wenn ich mir das Beispielbild mal anschaue, dann macht das nicht den Eindruck, als wäre das weiß in der Mitte. Dieser schöne Gelbton an der Seit ist doch schon nicht schlecht.
Auf jeden Fall solltest du die LED-Farbe festlegen, indem du einen Bereich in der Lampe markierst (manuell) und davon einen Durchschnittswert nimmst. Außerdem könntest du bei jedem Bild, das gemacht und gescannt wurde, die Farbe der LED neue bestimmen. Denn ich denke durch Belichtungseinstellung, Kontrastausgleiche und andere äußere Bedingungen, könnte sich die Farbe der LED auf dem Bild ständig ändern. Zitat:
Oder du sucht eine Stelle, an der Kreisförmig besonders viele Pixel (>80%) zutreffen. Edit: Könntest du vielleicht mal ein, zwei Origrinalbild von der Kamera zur Verfügung stellen, dann könnte ich auch ein bisschen probieren. Vielleicht finden wir ja dann eine Lösung für dein Problem. |
Re: Webcam - Form/Zeiger/LED erkennen?
Liste der Anhänge anzeigen (Anzahl: 3)
joa klar gerne :mrgreen:
die letzten 2 haben auch genau den gleichen hintergrund... |
Re: Webcam - Form/Zeiger/LED erkennen?
Ich gebe euch mal einen anderen Lösungsansatz:
Wie wäre es mit folgendem Vorschlag. Von Bildverarbeitungsprogrammen kenne ich die sogenannte Differenz-Berechnung zwischen 2 Bildern. Dabei entsteht aus 2 Bildern ein neues Bild das nur die Differenzen enthält. Wenn du diese Differenz-Berechnung bei den abfolgenden Bildern machst und die Kamera sich nicht bewegt, hast du eine ziemlich hohe Wahrscheinlichkeit heraus zu finden was sich bewegt hat in dem Differenz-Bild. Um Fehlerquellen auszuschließen würde ich evtl. das ganze auf Schwarz-Weiss und bestimmte Formen begrenzen. Vielleicht gibt dir das frischen Wind :) |
Re: Webcam - Form/Zeiger/LED erkennen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mal eine funktion zum Vergleichen zweier Zahlen geschrieben:
Delphi-Quellcode:
Die funktioniert für deinen Fall auch schon ganz gut. Ich finde immer perfekt den Mittelpunkt der LED.
function Compare(c1,c2: tcolor): boolean;
var r1,g1,b1,r2,g2,b2: integer; begin result := false; r1 := c1 and $FF; r2 := c2 and $FF; if (abs(r1-r2)<20) then begin G1 := (C1 shr 8) and $FF; G2 := (C2 shr 8) and $FF; if (abs(g1-g2)<20) then begin B1 := (C1 shr 16) and $FF; B2 := (C2 shr 16) and $FF; if (abs(b1-b2)<20) then result := true; end; end; end; Ich bin nur gerade im Informatikunterricht und da kann ich jetzt nicht wirklich weiter machen. Ich werde heute anchmittag mal das fertige Projekt reinsetzen. Momentan dauert eine Analyse eines Bildes ca. 250 ms (1500er Celeron mit Win2000), aber ich denke, den Code kann man noch super optimieren. Also bis nachher Edit: Im Anhang ist mein Projekt aus der Schule, aber der ist etwas unordentlich. Ich mach das anchher nochmal besser und übersichtlicher, aber ich muss das hier "lagern", sonst krieg ich es nicht nach Hause. Und wer Spaß hat, kann sichs ja trotzdem angucken. |
Re: Webcam - Form/Zeiger/LED erkennen?
hey, das funktioniert ja richtig gut!
allerdings versteh ich das nicht so wirklich... (shr? and $FF???) könntest du das vielleicht noch für einen Vergleich von 2 TColor32 anpassen? oder mir erklären was du da machst? weil das funktioniert echt tausend mal besser als bei mir.... |
Re: Webcam - Form/Zeiger/LED erkennen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz