Einzelnen Beitrag anzeigen

NeoXan
(Gast)

n/a Beiträge
 
#1

Art Motion Tracking mit Scanlines

  Alt 17. Dez 2005, 18:29
Also...das Prinzip (eine Art Motion Tracking, wenn man so will):

#1
- Ich lese ein Bitmap ein...in diesem Bitmap befindet sich ein oder mehrere Pixel mit einer ganz bestimmten Farbe.
- Ich durchsuche das Bitmap und finde die Position des Pixels und mache in einem Zweiten zur Laufzeit erstellten Bitmap den Pixel an genau derselben Position rot oder blau...irrelevant, ich hebe ihn also hervor
- Ich lese ein weiteres(!) Bitmap ein [bmpIN] und durchsuche ebenfals, dann den gefundenen Pixel wieder auf das zweite Bitmap übertragen

#2
- Dasselbe nur dass ich keine Pixel setze, sondern immer LineTo(x,y) benutze

Vorgehensweise
Jetzt: siehe Oben
hoffentlich später:
- damit es schneller geht das Bitmap zu durchsuchen, alle Farben bis auf die eine zu eleminieren... (so dass ich z.B. nur noch S/W habe)

4 Frames Beispiele:
Video1.jpg (das Endbild bmpOUT)
- so sieht es leider aus
Video0.jpg (von diesen Bildern wird gelesen)
- hier alle 4 Bilder zusammengesetzt...jedes Bild enthält einen Pixel

421 Frames Beispiel mit LineTo:
Lines1.jpg (Endbild bmpOUT)
-So sieht es mit LineTo und Scanline aus
Lines0.jpg (Endbild bmpOUT)
-und so mit Pixels statt Scanline als Suchalgorithmus...so sollte es auch mit scanloine ausschauen

Typ:
Delphi-Quellcode:
type
  TRGB32 = packed record
    B, G, R, A: Byte;
  end;
  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
  PRGB32Array = ^TRGB32Array;

  Line : PRGB32Array;
  BitmapIN.PixelFormat := pf32bit;
  BitmapOUT.PixelFormat := pf32bit;
Auch wenn ich versuche auf beiden Bildern dieselben Pixel anzusprechen, so erhalte ich ein eher konfuse Bild? Woran könnte das liegen? Wenn ich das ohne Scanlines mache, also mit Pixels dann dauert es natürlich um einiges länger, aber das Ergebnis ist korrekt :/
Delphi-Quellcode:
    for y := 0 to bmpIN.Height - 1 do
    begin
      Line := bmpIN.ScanLine[y];
      Line2 := bmpOUT.ScanLine[y];
      for x := 0 to bmpIN.Width - 1 do
      begin
          if (
          (Line[x].R = 0 ) AND
          (Line[x].G = 0 ) AND
          (Line[x].B In [250..255] )
          )
           then
           begin
            Line2[x].B := 255;
            Line2[x].R := 0;
            Line2[x].G := 0;
            Line2[x].A := 0;
           end;
      end;
    end;
Miniaturansicht angehängter Grafiken
video1_202.jpg   video0_150.jpg   lines1_151.jpg   lines0_149.jpg  
  Mit Zitat antworten Zitat