Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Ränder erkennen von Objekten (https://www.delphipraxis.net/165896-delphi-raender-erkennen-von-objekten.html)

Saminem 20. Jan 2012 07:31

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:
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;
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.
Brauch dirgend hilfe komm einfach nicht weiter.
ergibt mir immer ein Fehler aus in der Zeile wo ich pixel3 berechne.
Danke schonmal im vorraus

Uwe Raabe 20. Jan 2012 07:40

AW: Delphi Ränder erkennen von Objekten
 
Wie sind P1, P2 deklariert?

Saminem 20. Jan 2012 07:44

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

Sir Rufo 20. Jan 2012 07:46

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!"

Uwe Raabe 20. Jan 2012 08:25

AW: Delphi Ränder erkennen von Objekten
 
Zitat:

Zitat von Saminem (Beitrag 1146819)
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

Das habe ich nicht gefragt - es fehlt die Deklaration von P1 und P2. Oder in anderen Worten: von welchem Typ sind die?

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.

bernhard_LA 20. Jan 2012 13:35

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 )

Saminem 27. Jan 2012 07:17

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:
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;
Ich bitte um verständniss wenn ich auf fragen nicht immer die passende antwort habe. ;)


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