AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Webcam - Form/Zeiger/LED erkennen?

Ein Thema von mtin · begonnen am 20. Feb 2007 · letzter Beitrag vom 23. Feb 2007
Antwort Antwort
Benutzerbild von mtin
mtin

Registriert seit: 8. Jun 2005
34 Beiträge
 
#1

Webcam - Form/Zeiger/LED erkennen?

  Alt 20. Feb 2007, 21:57
Hallo!

http://img357.imageshack.us/img357/1715/eu3si9.th.jpg

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...
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:
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);
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!

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....
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 20. Feb 2007, 22:17
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
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 20. Feb 2007, 22:25
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 ). 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.
  Mit Zitat antworten Zitat
Benutzerbild von mtin
mtin

Registriert seit: 8. Jun 2005
34 Beiträge
 
#4

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 20. Feb 2007, 22:43
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...
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 20. Feb 2007, 22:59
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 von mtin:
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...
Dafür soll der Mittelpunkt ja gut sein. Du könntest auch den Mittelpunkt errechnen und dann mit der Standardabweichung viele falsche Pixel aussortieren und dann erneut den Mittelpunkt finden.
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.
  Mit Zitat antworten Zitat
Benutzerbild von mtin
mtin

Registriert seit: 8. Jun 2005
34 Beiträge
 
#6

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 20. Feb 2007, 23:47
joa klar gerne
die letzten 2 haben auch genau den gleichen hintergrund...
Angehängte Grafiken
Dateityp: bmp 3440_203.bmp (300,1 KB, 74x aufgerufen)
Dateityp: bmp 3435_795.bmp (300,1 KB, 53x aufgerufen)
Dateityp: bmp 3256_928.bmp (300,1 KB, 46x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 21. Feb 2007, 00:30
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
Stefan Hueg
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 21. Feb 2007, 12:03
Hallo,
ich habe mal eine funktion zum Vergleichen zweier Zahlen geschrieben:
Delphi-Quellcode:
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;
Die funktioniert für deinen Fall auch schon ganz gut. Ich finde immer perfekt den Mittelpunkt der LED.

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.
Angehängte Dateien
Dateityp: zip webcam_140.zip (3,5 KB, 54x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von mtin
mtin

Registriert seit: 8. Jun 2005
34 Beiträge
 
#9

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 23. Feb 2007, 00:57
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....
  Mit Zitat antworten Zitat
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Webcam - Form/Zeiger/LED erkennen?

  Alt 23. Feb 2007, 02:03
shr = Shift right (siehe Wikipedia)
$FF ist der Hexadezimalwert von 255.
Stefan Hueg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz