Einzelnen Beitrag anzeigen

Benutzerbild von newIndy
newIndy

Registriert seit: 18. Dez 2018
29 Beiträge
 
Delphi XE3 Professional
 
#1

Objekte zu ihrer Längsachse vertikal ausrichten

  Alt 22. Mär 2019, 20:20
Objekte fallen an einer Kamera vorbei.
Diese Objekte sollen für die anschliessende Vermessung,
Erkennung und Visualisierung zu ihrer Längsachse vertikal ausgerichtet werden,
also so, als würden diese Objekte immer vertikal zu ihrer Längsachse fallen.
Ich habe eine funktionierende Methode.
Mit 'LineDDA' wird geprüft, welche 'gedachte' Linie die längste ist,
als Resultat erhält man einen Drehwinkel, mit dem das Objekt ausgerichtet wird.
Gibt es einen besseren Weg?
Danke für eure Antworten.

Delphi-Quellcode:
Procedure CheckPoints(X,Y: Integer; Canvas: TCanvas); StdCall;
var R, G, B:Byte;
    Color:TColor;
begin
     {$R-}
     Color := Canvas.Pixels[X, Y];
     R := GetRValue(Color);
     G := GetGValue(Color);
     B := GetBValue(Color);
     // prüfe, ob Pixelfarbe <> BackgroundTRGBFillColor
     if (R <> MainForm.BackgroundTRGBFillColor.r) and (G <> MainForm.BackgroundTRGBFillColor.g)
        and (B <> MainForm.BackgroundTRGBFillColor.b) then
          Inc(Distance);
     {$R+}
end;

Procedure TMainForm.AlignVertically(var bmp:TBitmap; var angle:Double);
var X1, Y1, X2, Y2, MaxDist,Vektor:Cardinal;
begin
     maxDist := 0;
     angle := 0;
     for Vektor := 1 to 8 do
     begin
          Distance := 1;
          if Vektor = 1 then
          begin
               // keine Drehung OK
               X1 := bmp.Width div 2; Y1 := 0; X2 := X1; Y2 := bmp.Height;
               //TFNLineDDAProc
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 0;
               end;
          end;
          if Vektor = 2 then
          begin
               // Drehung um 90° OK
               // Horizontal gemessen = grösste Distanz > Drehung um 90°
               X1 := 0; Y1 := bmp.Height div 2; X2 := bmp.Width; Y2 := Y1;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 90;
               end;
          end;
          if Vektor = 3 then
          begin
               // Drehung um 45° OK
               X1 := 0; Y1 := 0; X2 := bmp.Width; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 315;
               end;
          end;
          if Vektor = 4 then
          begin
               X1 := bmp.Width div 4; Y1 := 0; X2 := X1 * 3; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 337.5;
               end;
          end;
          if Vektor = 5 then
          begin // OK ?
               X2 := bmp.Width div 4; X1 := X2 * 3; Y1 := 0; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := -340;
               end;
          end;
          if Vektor = 6 then
          begin
               // Drehung um -45° OK
               X1 := bmp.Width; Y1 := 0; X2 := 0; Y2 := bmp.Height;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := -135;
               end;
          end;
          if Vektor = 7 then
          begin // OK ?
               X1 := 0; Y1 := bmp.Height div 4; X2 := bmp.Width; Y2 := Y1 * 3;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := 300;
               end;
          end;
          if Vektor = 8 then
          begin // OK ?
               X1 := 0; Y2 := bmp.Height div 4; Y1 := Y2 * 3; X2 := bmp.Width;
               LineDDA(X1, Y1, X2, Y2, @CheckPoints, LongInt(bmp.Canvas));
               if Distance >= maxDist then
               begin
                    maxDist := Distance;
                    angle := -300;
               end;
          end;
     end;
end;
  Mit Zitat antworten Zitat