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; 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 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!