Autor Beitrag
Delphianfänger81
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Fr 29.12.06 23:36 
Ich versuche in dem unten angehängten Bild den Übergang von der Geraden in die Kurve möglichst genau zu finden und farblich zu markieren.
Von den beiden Punkten bräuchte ich dann die Koordinaten...
Leider bin ich auf dieser Seite noch nicht wirklich fündig geworden. Ich hoffe, ihr habt eine Idee. Ich bin Anfänger und stehe etwas auf dem Schlauch.


Zuletzt bearbeitet von Delphianfänger81 am So 17.06.07 09:33, insgesamt 2-mal bearbeitet
rey003
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 00:01 
Hallo,
zeichnest du das bild vorher selber?
Wenn nicht musst du das ganze bild durchgehen... Zeile für Zeile und schauen ob die weißen Pixel von der Geraden abweichen! Das ist best. ziemlich kompliziert, müsste aber gehen! Eine andere Lösung wüsste ich auf die Schnelle nicht!

_________________
Daniel S.
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Sa 30.12.06 00:04 
Das Bild filter ich aus einem normalen bmp. Zeichne es also nicht selbst. Wie kann ich die Zeilen einzeln durchgehen um eine Abweichung zu erkennen ???
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 00:05 
Hast du noch mehr Bilder? Falls ja, wie sehen die aus? Wie allgemein muss das ganze sein?
rey003
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 00:14 
Das wird verdammt schwer, denn ich hab grade gesehen das oben bei deinem Beispielbild die Linie gar nicht grade (parallel zur linken Bildkante) auf dem schwarzen Hintergrund liegt sondern nach oben sich immer weiter von der linken Kante des Bildes entfernt! Da wird Zeile für Zeile scannen und gucken ob das Pixel noch an der Stelle ist, wohl nicht so einfach werden! Denn woher willst du wissen ob die Kurve schon losgeht oder nicht? Das ist bestimmt machbar, aber dann nur in einer riesigen Procedure! Wofür brauchst du das denn?

_________________
Daniel S.
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Sa 30.12.06 00:23 
Habe das Bild mal vollständig hochgeladen.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 00:29 
Willst du ein Programm, welches bei diesem und ähnlichen Bildern die gesuchten Punkte findet, oder willst du es nur in diesem einen Bild?
Falls du ein Programm willst, mit was für Bildern muss das Programm rechnen? Mit einer gedrehten Variante des Objektes? Oder willst du die Koordinaten in diesem einen Bild (die kann ich dir auch ohne Programm nennen)?
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Sa 30.12.06 00:33 
In diesem und in ähnlichen Bilder, wobei es immer Zylinder sind. Nur die Größe und der Winkel im Raum kann variieren.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 00:37 
Je mehr man über das Objekt weiss, desto besser geht das ganze. Wenn du Grösse und Ausrichtung nicht kennst und auch nur die ungefähre Form bekannt ist, dann geht die Erkennung einfach sehr lange. Du kannst z.B. die Hough-Transformation des Bildes berechnen und erhältst daraus die Lage der beiden Geraden. Dann kannst du die Geraden verfolgen und Abweichungen feststellen.
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Sa 30.12.06 00:43 
Hough Transformation habe ich theoretisch schon gehört. Nur wie baue ich das in Delphi ein ???
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 00:51 
Canvas.Pixels, schon mal davon gehört? Sonst empfehle ich dir erst mal ein paar Tutorials durchzuarbeiten. Suche mal nach Delphi Crashkurs.
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Sa 30.12.06 00:56 
Das habe ich schon gemacht, aber irgendwie habe ich nicht das gefunden was ich suche oder kommme damit nicht klar. Bin leider totaler Anfänger .
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 01:22 
Unten die Hough Transformation. Die Suche und Optimierung überlasse ich dir selbst.

// Edit: Hab die Markierungen doch auch noch programmiert (siehe Bild im Anhang). Den Source davon geb ich aber nicht einfach so raus, dann hätt ich ja deine ganze Arbeit für dich erledigt. Du sollst ja auch was lernen und das ganze verstehen. Fragen zur Implementation beantworte ich aber gerne.
// Edit: Bugfix

ausblenden volle Höhe 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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  StdCtrls, ExtCtrls;

const
 MaxR = 256; // Genauigkeit
 MaxTheta = 256; // Genauigkeit

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Image2: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    Data: array[0..MaxTheta-1,0..MaxR-1] of DWord;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses math;

procedure TForm1.Button1Click(Sender: TObject);
var
 I, J, x, y: Integer;
 matches: array[0..1] of TPoint;
 value: DWord;
 ok: Boolean;
 c, s: Extended;
 mx, my: Integer;
 ex, ey, exy: Integer;
 p: PColor;
begin
  ex := Image1.Picture.Bitmap.Width;
  ey := Image1.Picture.Bitmap.Height;
  exy := max(ex,ey);
  mx := ex div 2;
  my := ey div 2;
  FillChar(Data, SizeOf(Data), 0);
  for y := 0-my to ey-my-1 do
   for x := 0-mx to ex-mx-1 do
    begin
     if Image1.Canvas.Pixels[x+mx,y+my] and $f8f8f8>0 then
      for I := 0 to MaxTheta-1 do
      begin
       sincos(I/MaxTheta*pi, s, c);
       J := Round(((x*c+y*s)/exy+1/2)*MaxR);
       if (J>=0) and (J<MaxR) then
        inc(Data[I,J]);
      end;
    end;
  for I := 0 to length(matches)-1 do
  begin
   value := 0;
   for x := 0 to MaxTheta-1 do
    for y := 0 to MaxR-1 do
     if Data[x,y]>value then
     begin
       ok := true;
       for J := 0 to I-1 do
        if sqr(matches[J].X-x)+sqr(matches[J].Y-y)<sqr(20) then
         ok := false; // nicht zu nahe an bekanntes Maximum
       if ok then
       begin
        value := Data[x,y];
        matches[I].X := x;
        matches[I].Y := y;
       end;
    end;
  end;
  for I := 0 to length(matches)-1 do
   with matches[I] do
   begin
    sincos(X/MaxTheta*pi, s, c);
    Image1.Canvas.Pen.Color := clRed;
    Image1.Canvas.MoveTo(round(c*(Y/MaxR-1/2)*exy+mx-s*exy),round(s*(Y/MaxR-1/2)*exy+my+c*exy));
    Image1.Canvas.LineTo(round(c*(Y/MaxR-1/2)*exy+mx+s*exy),round(s*(Y/MaxR-1/2)*exy+my-c*exy));
   end;

  Application.ProcessMessages;

  for x := 0 to MaxTheta-1 do
   for y := 0 to MaxR-1 do
    Image2.Canvas.Pixels[x,y] := min(255,data[x,y]*5);

end;

end.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von delfiphan am Sa 30.12.06 11:58, insgesamt 4-mal bearbeitet
rey003
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 01:29 
Waoh! Das es sowas gibt wusste ich noch gar nicht! Mathe pur! :wink:
Respekt! :flehan:

_________________
Daniel S.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 02:03 
Naja, es ist mehr oder weniger Brute-Force ;) Aber die dominantesten Linien findet man damit auf jeden Fall... Was man noch tun könnte: Die Hough-Transformation zuerst auf einem groben Gitter berechnen und dann die Transformation in der Nähe von Häufungspunkten nochmals verfeinert rechnen (höhere Genauigkeit). Zu hoch sollte man die Hough-Transformation aber auch nicht wählen (schlechte Statistik).


Zuletzt bearbeitet von delfiphan am Sa 30.12.06 11:59, insgesamt 2-mal bearbeitet
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 30.12.06 09:30 
user profile iconrey003 hat folgendes geschrieben:
Waoh! Das es sowas gibt wusste ich noch gar nicht! Mathe pur! :wink:
Respekt! :flehan:

Das ist für delfiphan eine Leichtigkeit.

@delfiphan: Was hast du studiert? Will das auch können ;-)

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Sa 30.12.06 11:34 
Wow, klasse !!!!! Erstmal vielen Dank. Versuche jetzt erstmal die Houghtransformation in mein Programm einzubauen.
Sollte das nicht klappen, melde ich mich wieder ;-)

Vielen Dank nochmal.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 30.12.06 12:11 
Keine Ursache ;) Hab das Programm noch etwas optimiert. Die dominantesten zwei (geraden) Linien sollten auch unter extrem schlechten Bedingungen gefunden werden (Download oben) :-D
Einloggen, um Attachments anzusehen!
rey003
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68

Win XP
BDS 2006
BeitragVerfasst: Sa 30.12.06 12:37 
Nicht schlecht! Das Programm werde ich mir mal aufheben! Vielleicht braucht man sowas nochmal! :wink:
Aber ich glaube soweit bin ich in der Schule noch nicht, dass ich sowas vollständig verstehen kann :D

_________________
Daniel S.
Delphianfänger81 Threadstarter
Hält's aus hier
Beiträge: 12

XP
Delphi 7
BeitragVerfasst: Di 02.01.07 12:10 
Okay, habe das Ganze bei mir noch etwas anders eingestellt...
Versuche jedoch verzweifelt die genaue Gradengleichung für die beiden roten Linien in Form Y = MX + C
auszulesen. Wie kann ich das denn machen???