Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - pixel finden


ankmanu - Do 19.11.09 22:26
Titel: pixel finden
Hi,

ich bin neu hier un dhab ne Frage:
Ich habe eine Webcam die ein Bild von einer roten Fläche macht. (das ist die Arbeitsfläche eines Roboters)Auf der Fläche steht irgendwo eine gelbe Tonne(ca.2x2cm).
Ich versuche nun bei dem Bild (bmp-format) die Position der Tonne festzustellen.
Wie kann ich das tun ?
Irgendwie kann man doch sicher bei jedem Pixel des Bildes den Gelbanteil rausfinden und dann vergleichen, wo am meisten gelb ist.
Am Ende soll ein x und ein y Wert der Tonne ausgegeben werden.

Da ich noch wenig Ahnung von Delphi habe, wäre es nett, wenn ihr mir gleich einen Code schicken würdet.

Viele Grüße

Manu
15 Jahre


GuaAck - Sa 21.11.09 18:19

Hallo Manu,

ich denke, dass ist es, was Du suchst (ich nutze Delphi 7):

Gruß
Guenther


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
VAR
  Bild: TBitmap;
  zeile, spalte: integer;
  blau, gelb, rot: integer; 
  zp: pbytearray; {In unit sysutils }
  bytes_per_pixel: integer;

BEGIN
  Bild := TBitmap.create;
  Bild.LoadFromFile('DeineDatei.bmp');
  IF Bild.pixelformat = pf24bit THEN
    bytes_per_pixel := 3
  ELSE IF Bild.pixelformat = pf32bit THEN
    bytes_per_pixel := 4
  ELSE
     BEGIN
      messagedlg('Dies ist keine 24-bit oder 32-bit-BMP-Datei ',
            mtwarning, [mbok], 0);
     bytes_per_pixel := 4
     END;

  FOR zeile := 0 TO Bild.Height - 1 DO
    BEGIN
      zp := Bild.scanline[zeile];
      FOR spalte := 0 TO Bild.Width - 1 DO
        BEGIN
        {Hier ist das Pixel in RGB; } 
        blau := zp[spalte * bytes_per_pixel];
        gelb := zp[spalte * bytes_per_pixel + 1];
        rot := zp[spalte * bytes_per_pixel + 2];
        .... usw.


ankmanu - So 22.11.09 14:43

Hi GuaAck,

danke für die Antwort, dass ist wirklich dass was ich gesucht habe.
Doch wie wird dann ein x und y wert ausgegeben?
Und wie stellt das Programm fest, dass der Pixel gelb ist? (passiert das mit scanline?)

Viele Grüße

Manu


der organist - So 22.11.09 15:43

naja, du hast ja von dem Pixel, das du grad durchgehst mit den beiden for-schleifen alle Farbwerte. Einfach noch ne if-Abfrage einbauen??


GuaAck - So 22.11.09 16:43

Hallo Manu,

a) Zeile = y (nach unten gezählt), Spalte = x (nach rechts gezählt).

b) Scanline gibt nur einen Pointer auf die Zeile des Bildes. Due musst dann jedes Pixel auf seine Farbe abfragen. Wenn due ein Foto als Basis hast, dann wird das gelb ja nicht an allen Stellen gleich sein. Erstelle doch einfach für deine Zeichenfläche eine ONMOUSEMOVE Procedure, in der kannst Du dann die Pixelfarbe auslesen (sinngemäß wie unten mit scanline), und dann die RGB-Komponenten z. B. in eine Editfeld schreiben. So kannst Du in Deinem Foto den "gelben" Farbbereich erkunden.

Gruß
Guenther


GuaAck - So 22.11.09 22:38

Korrektur: Da war ich von dem gelben Robotor so beeindruckt, dass ich in RGB das "G" als "gelb" bezeichnet habe. Welch Unsinn, es ist natürlich "ROT", "GRÜN" (!!) , "BLAU".
Ein hübsches Gelb ist etwa R=255, G=255, B=60;

Gruß
Guenther