![]() |
Delphi Ränder erkennen von Objekten
Moin Leute
Ich hänge in Informatik fest. Wir müssen nämlich ein Programm schreiben welches Ränder erkennt von ausgefülltern objekten.
Delphi-Quellcode:
Die erste Procedur funktioniert, jedoch meinte mein Lehrer, dass die zu lange braucht und ich es lieber mit der Scanline probieren soll, da die 100 mal schneller ist.
procedure TForm1.Button3Click(Sender: TObject);
var n,t,pixel1,pixel2,pixel3:integer; schwellenwert1,schwellenwert2,schwellenwert3 :extended; begin for n:=1 to hoehe do begin for t:=1 to breite do begin pixel1:=image1.Canvas.Pixels[n,t]; pixel2:=image1.canvas.pixels[n,t-1]; pixel3:=image1.canvas.pixels[n-1,t]; schwellenwert1:= (pixel1 * 0.5) + (pixel2 * 0.5); schwellenwert2:= (pixel1 * 0.5) + (pixel3 * 0.5); schwellenwert3:= (pixel2 * 0.5) + (pixel3 * 0.5); if schwellenwert1 = (16777215 * 0.5) then begin image2.Canvas.Pixels[n,t]:=clblack; end; if schwellenwert2 =(16777215 * 0.5) then begin image2.Canvas.Pixels[n,t]:=clblack; end; if schwellenwert3 =(16777215 * 0.5) then begin image2.Canvas.Pixels[n,t]:=clblack; end; end; end; end; procedure TForm1.Button4Click(Sender: TObject); var k,n,t,pixel1,pixel2,pixel3:integer; gewichtung1,gewichtung2,gewichtung3:extended; begin k:=6; for n:=1 to hoehe -2 do begin P1:=Image1.Picture.Bitmap.ScanLine[n]; P2:=Image1.Picture.Bitmap.ScanLine[n+1]; //P3:=image1.Picture.Bitmap.ScanLine[n]; for t:=1 to (breite*3) do begin pixel1:=P1[t+3]; pixel2:=P2[t+3]; pixel3:=P1[t+k]; k:=k+3; gewichtung1:= pixel1+pixel2+pixel3; if gewichtung1 = 255 then begin image2.Canvas.Pixels[n,t]:=clblack; end; if gewichtung1 = 510 then begin image2.Canvas.Pixels[n,t]:=clblack; end end; end; Brauch dirgend hilfe komm einfach nicht weiter. ergibt mir immer ein Fehler aus in der Zeile wo ich pixel3 berechne. Danke schonmal im vorraus |
AW: Delphi Ränder erkennen von Objekten
Wie sind P1, P2 deklariert?
|
AW: Delphi Ränder erkennen von Objekten
P1 ist die Scanline aus der ersten Zeile des Bildes
P1:=Image1.Picture.Bitmap.ScanLine[n]; P2:=Image1.Picture.Bitmap.ScanLine[n+1]; P2 ist die nächste zeile um dann diese beiden zeilen zu verglecihen |
AW: Delphi Ränder erkennen von Objekten
... und noch wichtiger ... Was für ein Fehler?
Oder steht irgendwo plötzlich "Fehler!" auf dem Schirm? Ist ja wie bei der Werbung "Kuchen!" |
AW: Delphi Ränder erkennen von Objekten
Zitat:
Wenn es nämlich Pointer sind, wie ScanLine vermuten lässt, dann würde ein Array-Zugriff á la P1[x] vom Compiler zu Recht angemeckert. |
AW: Delphi Ränder erkennen von Objekten
ich verstehe den Code nicht ganz - warum berechnest Du (Pixel1+Pixel2)/2,
bessere wäre doch der Gradient geeignet um Übergänge zu erkennen, dh. falls (pixel1-pixel2) < Schwelle dann schwarz sonst weiss im Gradienten Bild (suche mal nach Canny edge detector mit google ) |
AW: Delphi Ränder erkennen von Objekten
Danke schonmal für die vielen Vorschläge habe jetzt geschaft das Programm halbwegs zu laufen zu bringen jedoch erkennt er bei einem 4 Ecke noch nicht die rechte Ecke erkannt.
Delphi-Quellcode:
Ich bitte um verständniss wenn ich auf fragen nicht immer die passende antwort habe. ;)
procedure TForm1.Button4Click(Sender: TObject);
var k,n,t,pixel1,pixel2,pixel3:integer; gewichtung1,gewichtung2,gewichtung3:extended; begin for n:=1 to hoehe -2 do begin P1:=Image1.Picture.Bitmap.ScanLine[n]; P2:=Image1.Picture.Bitmap.ScanLine[n+1]; P3:=Image2.Picture.Bitmap.ScanLine[n]; for t:=0 to (breite) do begin pixel1:=P1[t*3]; pixel2:=P2[t*3]; pixel3:=P1[t*3+3]; gewichtung1:= pixel1+pixel2+pixel3; if gewichtung1 = 255 then begin P3[t*3+0]:=0; P3[t*3+1]:=0; P3[t*3+2]:=0; end; if gewichtung1 = 510 then begin P3[t*3+0]:=0; P3[t*3+1]:=0; P3[t*3+2]:=0; end; end; end; image2.refresh; end; var Form1: TForm1; breite,hoehe :integer; P1:pbytearray; P2:pbytearray; P3:pbytearray; P4:pbytearray; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz