AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Ränder erkennen von Objekten
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Ränder erkennen von Objekten

Ein Thema von Saminem · begonnen am 20. Jan 2012 · letzter Beitrag vom 27. Jan 2012
Antwort Antwort
Saminem

Registriert seit: 18. Aug 2010
14 Beiträge
 
#1

Delphi Ränder erkennen von Objekten

  Alt 20. Jan 2012, 07:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi Ränder erkennen von Objekten

  Alt 20. Jan 2012, 07:40
Wie sind P1, P2 deklariert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Saminem

Registriert seit: 18. Aug 2010
14 Beiträge
 
#3

AW: Delphi Ränder erkennen von Objekten

  Alt 20. Jan 2012, 07:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Delphi Ränder erkennen von Objekten

  Alt 20. Jan 2012, 07:46
... und noch wichtiger ... Was für ein Fehler?
Oder steht irgendwo plötzlich "Fehler!" auf dem Schirm?
Ist ja wie bei der Werbung "Kuchen!"
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphi Ränder erkennen von Objekten

  Alt 20. Jan 2012, 08:25
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Delphi Ränder erkennen von Objekten

  Alt 20. Jan 2012, 13:35
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 )
  Mit Zitat antworten Zitat
Saminem

Registriert seit: 18. Aug 2010
14 Beiträge
 
#7

AW: Delphi Ränder erkennen von Objekten

  Alt 27. Jan 2012, 07:17
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz