Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Objektverfolgung (https://www.delphipraxis.net/63999-objektverfolgung.html)

Funk 25. Feb 2006 22:35


Objektverfolgung
 
Hallo,
hier meine Problembeschreibung:
Ein Objekt (Insekt) liegt auf einer Platte und wird von einer WebCam durch ein Mikroskop betrachtet. Sobald sich das Objekt bewegt, soll die Platte so bewegt werden, dass sich das Objekt wieder im Fokus der Cam befindet.
Als erstes muss das Objekt erkannt werden
- die Lichtverhältnisse bleiben durch die Mikroskoplampe fast immer gleich
- das Objekt kann die gleiche Farbe wie die Platte haben
-->bin bei der Suche, auf einen Partikelfilter gekommen, habe aber keine Erfahrungen und meine Frage ist, hat jemand damit schon gearbeitet und kann mir einen Rat geben? Oder gibt es andere Lösungen, ein Objekt zu erkennen?

Danke im Voraus für eure Hilfe.

inherited 25. Feb 2006 22:58

Re: Objektverfolgung
 
Bitte überprüfe den Ort wo du dies erstellt hast...

DP-Maintenance 25. Feb 2006 22:58

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Multimedia" verschoben.
Das gehört nicht in die Code-Library.

marabu 26. Feb 2006 08:52

Re: Objektverfolgung
 
Herzlich willkommen in der Delphi-PRAXiS, Funk.

Die Objekterkennung und -Verfolgung ist ein Standardproblem der digitalen Bildverarbeitung. Die Bilder einer digitalen Kamera musst du als Zeitreihenbilder begreifen. Über die Bilddifferenz und eine Schwellwertbetrachtung kannst du dann einen - einfachheitshalber rechteckigen - Bildbereich identifizieren, der dem beobachteten Objekt zuzuordnen ist. Über die Verschiebung des Flächenschwerpunktes können dann die Schrittmotoren für die Nachführung des Objektes angesteuert werden.

Freundliche Grüße vom marabu

Funk 15. Mär 2006 12:45

Re: Objektverfolgung
 
Bin jetzt gerade dabei zwei Bilder die ich von der Cam aufnehme, zu vergleichen. Ungleiche Pixels werden rot hinterlegt.

Delphi-Quellcode:
for y := 0 to TestImage.Picture.Bitmap.Height - 1 do
  begin
    P := TestImage.Picture.Bitmap.ScanLine[y];
    P2 := OrgImage.Picture.Bitmap.ScanLine[y];
    P3 := PrevImage.Picture.Bitmap.ScanLine[y];

    for x := 0 to TestImage.Picture.Bitmap.Width - 1 do
    begin
      if RGB(P^.rgbRed, P^.rgbGreen, P^.rgbBlue)-
        RGB(P2^.rgbRed, P2^.rgbGreen, P2^.rgbBlue) > Schwellenwert then
      begin
              P3^.rgbRed := $FF; // = RGB (255, 0, 0) = clRed
              P3^.rgbGreen := 0;
              P3^.rgbBlue := 0;
     end;
Mein Problem ist nun, sobald ich das Rauschen der Kamera reduzieren möchte und damit meinen Schwellenwert erhöhe, bekomme ich die Veränderung des Objekts nicht mehr markiert. Ich möchte ja nur die Veränderung des Objektes herausfinden.
Was mach ich falsch oder wie könnte ich das besser machen?

marabu 15. Mär 2006 12:58

Re: Objektverfolgung
 
Hallo Funk,

dein Schwellenwert muss den Abstand berücksichtigen, nicht die Differenz. Wahrscheinlich bekommst du später bessere Ergebnisse wenn du mit ein-kanaligen Bildern rechnest.

Grüße vom marabu

Funk 15. Mär 2006 13:34

Re: Objektverfolgung
 
Hallo und vielen Dank!
Doch was sind 1 Kanalige Bilder? schwarz-weiß?
Kannst du mir bitte etwas genauer erklären was du mit "Abstand" meinst?

Gruß Funk

marabu 15. Mär 2006 17:13

Re: Objektverfolgung
 
Das hast du schon richtig verstanden - 1-kanalige Bilder sind Grauton-Bilder. Es ist besser mit dem Abstand abs() zweier Grauwerte zu arbeiten, als mit der Differenz, bei der du negative Eregbnisse erhalten kannst. Ich hoffe, dass der Objektträger homogen ausgeleuchtet ist, sonst kannst du das Binärbild schlecht über einen statischen Schwellwert berechnen.

Freundliche Grüße

marabu

Funk 15. Mär 2006 17:50

Re: Objektverfolgung
 
Hey super, Danke!!!
Jetzt müsste ich noch die Position der Veränderung heruasfinden. Falls du eine Idee hast, wäre ich dankbar.

marabu 15. Mär 2006 19:13

Re: Objektverfolgung
 
Ich könnte mir vorstellen, dass eine Quantisierung des Bildes mit empirisch ermittelter Granularität am ehesten zum Ziel führt. Dabei halbierst du schrittweise die Auflösung und bildest Superpixel (2*2, 4*4, 8*8, 16*16, ...). Für diese berechnest du den mittleren Grauwert. Wenn du eine geeignete Auflösung ermittelt hast, dann kannst du von dem resultierenden Grauton-Bild ein Binärbild erstellen, aus dem du dann das bounding rectangle für das observierte Objekt berechnen kannst. Der Schnittpunkt der Diagonalen könnte der Zielpunkt für die Neuausrichtung des Objektivs sein. Andere Verfahren sind denkbar.

marabu

Funk 18. Mär 2006 15:38

Re: Objektverfolgung
 
Hallo,
habe jetzt ein kleines Programm geschrieben, wo ich mein Bild in 4 Flächen aufteile und jeweils von der Fläche den mittleren Grauwert errechne. Doch ich bekomme nicht die gewünschte Werte heraus.
Delphi-Quellcode:
procedure TForm1.GrauwertClick(Sender: TObject);
var
a,b,c,d,x,y,Grauwert1,Grauwert2,Grauwert3,Grauwert4:integer;
G: PByteArray;
begin
Grauwert1:=0; Grauwert2:=0; Grauwert3:=0; Grauwert4:=0;
a:=TestImage.Picture.Bitmap.Width;
b:=TestImage.Picture.Bitmap.Height;
c:= round(TestImage.Picture.Bitmap.Width/2);
d:= round(TestImage.Picture.Bitmap.Height/2);

 for y := 0 to d  do
  begin
     G := TestImage.Picture.Bitmap.ScanLine[y];
     for x := 0 to c do
    begin
      Grauwert1:=Grauwert1+G[x];
    end;
     for x := c to a -1 do
    begin
      Grauwert2:=Grauwert2+G[x];
    end;
 end;
 for y := d to b-1 do
  begin
  G := TestImage.Picture.Bitmap.ScanLine[y];
     for x := 0 to c do
    begin
      Grauwert3:=Grauwert3 + G[x];
    end;
     for x:= c +1 to a -1 do
    begin
      Grauwert4:=Grauwert4+G[x];
    end;
 end;
  Form1.Label1.Caption:=floattostr(Grauwert1 div (d * c));
  Form1.Label2.Caption:=floattostr(Grauwert2 div (d * c));
  Form1.Label3.Caption:=floattostr(Grauwert3 div (d * c));
  Form1.Label4.Caption:=floattostr(Grauwert4 div (d * c));
end;
Bekomme nur ein richtiges Ergebnis, wenn das Objekt unten-links oder oben-Links positioniert ist.
Sobald das Objkt nach rechts verschoben wird bekomme ich falsche Werte!
Was mache ich falsch?
Meine Idee ist das ich die Veränderungen des mittleren Grauwerts der einzelnen Flächen vergleiche, und somit Auswertungen treffe.

marabu 18. Mär 2006 15:51

Re: Objektverfolgung
 
Kannst du mir zwei geeignete Bilddateien zur Verfügung stellen?

Grüße vom marabu

Funk 18. Mär 2006 23:49

Re: Objektverfolgung
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hier die gewünschten Bilder!

Funk 26. Mär 2006 00:45

Re: Objektverfolgung
 
Hallo,
da ich mit ScanLine falsche Ergebnisse bekomme, habe ich das ganze jetzt mit Canvas.Pixel gemacht. Doch das ist mir etwas zu langsam. Ich beobachte schon nicht das ganze Bild, sondern einen Bereich im Zentrum.
Gibt es da eine andere Möglichkeit? Nur jeden zweiten Pixel auslesen???(immer noch zu langsam!!!)

Gruss
Funk

Ultimator 26. Mär 2006 00:49

Re: Objektverfolgung
 
Die Hier im Forum suchenGraphics32-Bibliothek sollte da auf jeden Fall Abhilfe schaffen, das ist die höchstopimierte (hochoptimierteste? am höchsten optimierte?) Graphikbibliothek, die ich kenne :)

SirThornberry 26. Mär 2006 10:14

Re: Objektverfolgung
 
Scanline sollte eigentlich keine falschen Werte zurück liefern da es ja direkt einen Pointer auf den Speicher zurück liefert. Der fehler sollte also in der Art der Verwendung von Scanline liegen. Poste einfach mal wie du mit Scanline versuchst auf das Bild zu zugreifen und vielleicht findet sich der Fehler. Ich vermute das du dich mit einer falschen Pixelgröße von Pixel zu Pixel hangelst.

marabu 26. Mär 2006 11:38

Re: Objektverfolgung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Funk,

habe dich ein wenig aus dem Auge verloren. Im Anhang findest du eine kleine Demo, die den ersten Teil meiner Vorgehensweise aus Beitrag #10 implementiert.

Grüße vom marabu

Funk 27. Mär 2006 20:57

Re: Objektverfolgung
 
Hallo marabu,

erstmal vielen Dank für das Programm! In meine Quellenangabe schreibe ich dann "marabu"!

Zitat:

...aus dem du dann das bounding rectangle für das observierte Objekt berechnen kannst. Der Schnittpunkt der Diagonalen könnte der Zielpunkt für die Neuausrichtung des Objektivs sein
So wie ich es verstehe, das dunkelste Rechteck(in meinem Fall) wird dann ins Zentrum positioniert! Oder was hast du damit gemeint?

Gruß Funk

marabu 27. Mär 2006 21:37

Re: Objektverfolgung
 
Eine Zentralpositionierung ist eine gute Idee, wenn das "Objekt" langsam im Vergleich mit der Stellgeschwindigkeit der beiden Schrittmotoren ist. Wenn nicht, dann wird eventuell ein wenig künstliche Intelligenz gefragt sein.

Gute Nacht

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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