Quellcode
cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale )
{
angle *= CV_PI/180;
double alpha = cos(angle)*scale;
double beta = sin(angle)*scale;
Mat M(2, 3, CV_64F);
double* m = M.ptr<double>();
m[0] = alpha;
m[1] = beta;
m[2] = (1-alpha)*center.x - beta*center.y;
m[3] = -beta;
m[4] = alpha;
m[5] = beta*center.x + (1-alpha)*center.y;
return M;
}
ableiten
1. Es gibt Bilder und Wahrheit
Warum ein Bild wie dieses zeichnen? Es ist erwähnenswert, dass die Abszisse des Bildes im Computer nach rechts und die Ordinate nach unten zunimmt! ! !
2. Aufgabenbeschreibung
Wobei Winkel DAB=α, Winkel CAB=θ
AD ist parallel zur Abszissenachse, AE ist parallel zur Ordinatenachse. Jetzt müssen Sie Punkt A (centerX, centerY) ==>> Abkürzung (cx, cy) als Rotationszentrum verfolgen
Drehen Sie Punkt B um θ, um Punkt C zu erreichen. Nehmen Sie an, dass die Koordinaten von Punkt C (x', y') sind, und lösen Sie die mathematische Beziehung zwischen x', y' und x, y, θ, cx, cy
3. Berechnung starten
AC wird durch Drehen von AB erhalten, daher ist seine Länge gleich, sei AC=AB=L
Also aus der Kenntnis trigonometrischer Funktionen
x'=cx+L*cos(α-θ)=cx+L*(cos(α)*cos(θ)+sin(α)*sin(θ)) 1式
y'=cy+L*sin(α-θ)=cy+L*(sin(a)*cos(θ)-sin(θ)*cos(a)) 2式
cos(α)=(x-cx)/L 3 Formel
sin(a)=(y-cy)/L 4式
Durch Einsetzen von Gleichung 3 und Gleichung 4 in Gleichung 1 und Gleichung 2 können α und L eliminiert werden. erhalten
x'=cx+(x-cx)*cos(θ)+(y-cy)*sin(θ)=x*cos(θ)+y*sin(θ)+cx*(1-cos(θ)) -cy*sin(θ)
y'=cy+(y-cy)*cos(θ)-(x-cx)*sin(θ)=x*(-sin(θ))+y*cos(θ)+cy*(1-cos( θ))+cx*sin(θ)
Das Extrahieren der Matrix ist
[
[cos(θ),sin(θ),cx*(1-cos(θ))-cy*sin(θ)],
[-sin(θ),cos(θ),cy*(1-cos(θ))+cx*sin(θ)]
]
verifizieren
Das einzige Kriterium für die Wahrheitsprüfung ist die Praxis
Python-Code
import numpy as np
import cv2 as cv
import math
cx = 250
cy = 250
angle = 45
scale = 1.0
opencv_M = cv.getRotationMatrix2D((cx, cy), angle, scale)
print(f"opencv_M=\n{opencv_M}")
print("=================================")
cos_angle = math.cos(angle / 180.0 * math.pi)
sin_angle = math.sin(angle / 180.0 * math.pi)
self_M = np.array([
[cos_angle, sin_angle, cx * (1 - cos_angle) - cy * sin_angle],
[-sin_angle, cos_angle, cy * (1 - cos_angle) + cx * sin_angle]
])
print(f"self_M=\n{self_M}")
Rotationszentrum (cx,cy)=(250,250)
Drehwinkel θ=45°
Kein Skalierungsvorgang, Skalierung = 1,0
Operationsergebnis
Es ist ersichtlich, dass die Operationsergebnisse genau gleich sind und der Operationsprozess dieser Funktion tatsächlich dem in der obigen Formel gezeigten entspricht
Notiz
Der Eingabeparameter der trigonometrischen Funktion der mathematischen Funktionsbibliothek in Python wird in wie viel Pi umgewandelt, anstatt direkt einen Winkel einzugeben (genauer gesagt akzeptiert es Bogenmaß).