AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildanalyse/-vergleich
Thema durchsuchen
Ansicht
Themen-Optionen

Bildanalyse/-vergleich

Ein Thema von Slashmob · begonnen am 8. Dez 2011 · letzter Beitrag vom 11. Dez 2011
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

AW: Bildanalyse/-vergleich

  Alt 9. Dez 2011, 22:24
kante:=spinedit2.value;
gehört nicht in die Prozedur, hier soll kantenlaenge verwendet werden, also im Aufruf spinedit2.value mitgeben.
Die Quadratemalfuntion ist nicht rekursiv (selbstaufrufend wie floodfill) zu implementieren.
Der Code der zu implementieren ist kommt nur in Case 3:
Quadrate kann man malen mit
MoveTo und 4 * LineTo
oder
Image3.Canvas.Brush.Style := bsClear;
Image3.Canvas.Rectangle(L,O,R,U);

nach dem Quadratemalen wird floodfill aufgerufen (kann auch innerhalb von quadratmalen aufgerufen werden)
fillcolor ist clRed, oldColor ist die Grundfarbe des Bildes also clBlack, diese Funktion ruft sich solange selbst wieder auf bis der gefundene Punkt nicht mehr oldColor entspricht, als wenn der Rahmen von Quadratemalen erreicht wurde.


Einen Teil in der Aufgabe hatten wir übersehen, weder im StringGrid noch in der Malroutine sollen Benachbarte Punkte nach Definition Kantenlänge erfasst werden. Dies bedeutet dass schon beim Scanvorgang Image3 miteinbezogen werden muss und nur wenn pixels[i,j] in Bild 3 schwarz ist dieser Punkt erfasst wird (gleiche Rangstufe wie der Schwellenwert), es muss dann wenn ein Punkt gefunden wurde auch direkt das Quadrat in Image3 gemalt und gefüllt werden, damit ein Beispielsweise direkt benachbarter Punkt bein nächsten Vergleich ausgeschlossen wird.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#2

AW: Bildanalyse/-vergleich

  Alt 9. Dez 2011, 22:41
Ah super, danke schon mal für die Infos. Werde mich mal dransetzen und versuchen das umzusetzen.
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#3

AW: Bildanalyse/-vergleich

  Alt 10. Dez 2011, 10:28
kante:=spinedit2.value;
gehört nicht in die Prozedur, hier soll kantenlaenge verwendet werden, also im Aufruf spinedit2.value mitgeben.
Die Quadratemalfuntion ist nicht rekursiv (selbstaufrufend wie floodfill) zu implementieren.
Der Code der zu implementieren ist kommt nur in Case 3:
Quadrate kann man malen mit
MoveTo und 4 * LineTo
oder
Image3.Canvas.Brush.Style := bsClear;
Image3.Canvas.Rectangle(L,O,R,U);

nach dem Quadratemalen wird floodfill aufgerufen (kann auch innerhalb von quadratmalen aufgerufen werden)
fillcolor ist clRed, oldColor ist die Grundfarbe des Bildes also clBlack, diese Funktion ruft sich solange selbst wieder auf bis der gefundene Punkt nicht mehr oldColor entspricht, als wenn der Rahmen von Quadratemalen erreicht wurde.


Einen Teil in der Aufgabe hatten wir übersehen, weder im StringGrid noch in der Malroutine sollen Benachbarte Punkte nach Definition Kantenlänge erfasst werden. Dies bedeutet dass schon beim Scanvorgang Image3 miteinbezogen werden muss und nur wenn pixels[i,j] in Bild 3 schwarz ist dieser Punkt erfasst wird (gleiche Rangstufe wie der Schwellenwert), es muss dann wenn ein Punkt gefunden wurde auch direkt das Quadrat in Image3 gemalt und gefüllt werden, damit ein Beispielsweise direkt benachbarter Punkt bein nächsten Vergleich ausgeschlossen wird.
Was ich nicht verstehe... Wir haben doch die Quadratmal-Prozedur procedure tform1.quadratmalen(image,top_,left_,kantenlaenge,farbe:integer); die uns mit Hilfe der Parameter das Quadrat malen soll. Wieso muss ich hier mit moveto/lineto bzw. rectangle arbeiten? Ich hatte mir das so vorgestellt, dass ich bei image3 das left_ und bottom_ bestimme, die kantenlänge aus dem spinedit2.value einlese und die farbe= rot setze und mir automatisch ein Quadrat gemalt wird. Ist das nicht so?
Also bin mit den beiden Prozeduren und deren Beziehung zu einander überfordert. Wie muss das als Code aussehen?

Ich stell nochmal den ganzen code rein:
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Grids, Spin;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Label1: TLabel;
    Label2: TLabel;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure floodFill_(x,y,fillColor,oldColor: integer);
    procedure quadratmalen(image,top_,left_,kantenlaenge,farbe:integer);
    procedure AddFound(nr,x,y,wert:integer);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  b,h:integer;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin

     b:=image1.width; h:=image1.height; // Breite und Höhe der Imagefelder
     image2.width:=b; image2.height:=h;
     image3.width:=b; image3.height:=h;
     image4.width:=b; image4.height:=h;

     image1.canvas.brush.color:=clblack; // Hintergrundfarben
     image2.canvas.brush.color:=clblack;
     image3.canvas.brush.color:=clblack;
     image4.canvas.brush.color:=clwhite;

     image1.canvas.fillrect(rect(0,0,b,h)); // Rechteck mit obigen Farben ausfüllen
     image2.canvas.fillrect(rect(0,0,b,h));
     image3.canvas.fillrect(rect(0,0,b,h));
     image4.canvas.fillrect(rect(0,0,b,h));

     image1.Picture.loadfromfile('1sw.bmp'); // Bilder hochladen
     image2.Picture.loadfromfile('pic2.bmp');

      form1.caption:= 'Bildanalyse-Suche nach Vergleichsschwankungen';
end;

procedure tform1.floodFill_(x,y,fillColor,oldColor: integer);
   begin
   with image3.canvas do
   if (pixels[x,y]=oldColor) then
      begin
      Pixels[x,y]:= fillcolor;
      floodFill_(x+1,y, clred, oldColor);
      floodFill_(x-1,y, clred, oldColor);
      floodFill_(x,y+1, clred, oldColor);
      floodFill_(x,y-1, clred, oldColor);
   end;
end;

procedure tform1.quadratmalen(image,top_,left_,kantenlaenge,farbe:integer);
   var
   x, // Koordinaten
   y
        :integer;
  

   begin

   x:=stringgrid1.cells[1,nr]; // Koordinaten aus stringrid nehmen - klappt nicht!
   y:=stringgrid1.cells[2,nr];
 
    case image of
      1:
         with form1.image1.canvas do
            begin
         end;
      2:
         with form1.image2.canvas do
            begin
            end;
      3:
         with form1.image3.canvas do
            begin
            quadratmalen(3,round(x-(spinedit2.value/2)),round(y-(spinedit2.value/2)),spinedit1.value,clred); // Quadratmalen mittels zeichnen der 4 Linien - klappt nicht!

            pen.color:=clred;
            moveto(round(x-spinedit2.value/2),round (y-spinedit2.value/2)); // klappt nicht!
            lineto(round(x+spinedit2.value/2),round (y-spinedit2.value/2));
            lineto(round(x+spinedit2.value/2),round (y+spinedit2.value/2));
            lineto(round(x-spinedit2.value/2),round (y+spinedit2.value/2));
            lineto(round(x-spinedit2.value/2),round (y-spinedit2.value/2));
         end;
      4:
         with form1.image4.canvas do
            begin
         end;
      end;
   end;

procedure TForm1.Addfound (nr,x,y,wert:Integer);
Begin

     If stringgrid1.rowcount < (nr+1) then
        stringgrid1.rowcount:= nr+1;
        stringgrid1.cells[0,0]:='Nr.';
        stringgrid1.cells[1,0]:='X';
        stringgrid1.cells[2,0]:='Y';
        stringgrid1.cells[3,0]:='Diff-Wert';

        stringgrid1.cells[0,nr]:=inttostr(Nr);
        stringgrid1.cells[1,nr]:=inttostr(X);
        stringgrid1.cells[2,nr]:=inttostr(Y);
        stringgrid1.cells[3,nr]:=inttostr(Wert);
end;

procedure TForm1.Button1Click(Sender: TObject);
Var

    farbe1, // Pixelfarbe im Image1
    farbe2, // Pixelfarbe im Image2
    wert, // Differenzwert
    schwellwert, // Schwellwert zum Vergleich
    x, // Laufindex
    y, // Laufindex
    z, // Zähler
    kante
            :integer;

begin
     schwellwert:=spinedit1.value; // Voreinstellung 10
     kante:=spinedit2.value;

     z:=0; // Zähler auf Null gesetzt
     For x:=0 to b-1 do // Pixelweise Bilder auslesen
      Begin
           For y:=0 to h-1 do
               Begin
                    farbe1 := image1.canvas.pixels[x,y]; // Farbe merken
                    farbe2 := image2.canvas.pixels[x,y];
                    wert:= (farbe1 and clred)-(farbe2 and clred); // Differenzwert
                    If wert > schwellwert then // mit Schwellwert vergleichen
                      begin
                       inc(z); // Zähler hochzählen
                       AddFound(z,x,y,wert); // Daten in Stringgrid einfügen
                      end;
               end;

      end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Bildanalyse/-vergleich

  Alt 10. Dez 2011, 11:41
das gehört da nicht rein:

Delphi-Quellcode:
 x:=stringgrid1.cells[1,nr];
....
wenn es Sinn machen würde müsstest Du den String auch noch in einen Integer umwandeln (StrToInt)

Delphi-Quellcode:
      3:
         with form1.image3.canvas do
            begin
            // folgende Zeile hat hier nichts verloren ....
            quadratmalen(3,round(x-(spinedit2.value/2)),round(y-(spinedit2.value/2)),spinedit1.value,clred); // Quadratmalen mittels zeichnen der 4 Linien - klappt nicht!
            //pen.color:=clred;
            pen.color:=farbe;
und statt spinedit2.value sollst Du nach Vorgabe _kantenlaenge verwenden


Die Prozedur gehört in die Ecke wo Du AddFound aufrufst, mit
quadratmalen(3,j,i,SpinEdit2.Value,clRed);
Ihr sollt ja den Sinn und die Funktion von Prozeduren verstehen lernen ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#5

AW: Bildanalyse/-vergleich

  Alt 10. Dez 2011, 12:16
Ja, aber wie ruf ich die Prozedur richtig auf?
Und wie sieht die richtige Zuweisung aus?
Bei diesem Teil hab ich Verständisprobleme.

Im moment weiß ich nur, dass ich mit de Prozedur "quadratmalen" ein Quaadrat, bestehend aus 4 Linien, zeichnen und diese innere Fläche mit der Prozedur "floodfill" ausfüllen soll.
Die Allgemeinform der Prozeduren steht ja in der Aufgabe, aber jetzt koknret für meinen Fall versteh ich das nicht so recht wie das als code aussehen soll.

  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Bildanalyse/-vergleich

  Alt 10. Dez 2011, 15:00
Ich hatte Dir geschrieben wo und wie die Prozedur aufzurufen ist.
Ich hatte geschrieben was da nicht reingehört und was wie geändert werden muss.
Der MoveTo LineTo Part passt im Prinzip nur solltest Du top_ und left_ statt y und x verwenden, sowie wie beriets geschrieben kantenlaenge und farbe.

Vielleicht solltest Du mal da http://www.christian-stelzmann.de/artikel/crashkurs.htm vorbeischauen.
Wenn Du nicht verstehst wie was tickt solltest Du Dir ein kleineres Projekt selbst aufsetzen und mit den Canvasroutinen etwas herumspielen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  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 18:36 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