Autor Beitrag
ankmanu
Hält's aus hier
Beiträge: 5

Win XP
Code Gear RAD Studio C++ Builder, Lazarus
BeitragVerfasst: Do 19.11.09 22:26 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Sa 21.11.09 18:19 
Hallo Manu,

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

Gruß
Guenther

ausblenden volle Höhe 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP
Code Gear RAD Studio C++ Builder, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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??

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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