Registriert seit: 18. Dez 2018
29 Beiträge
Delphi XE3 Professional
|
Objekte zu ihrer Längsachse vertikal ausrichten
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;
|