Grundlegende Analyse der getRotationMatrix2D-Funktion von Opencv

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ß).

Ich denke du magst

Origin blog.csdn.net/qq_36694133/article/details/131240306
Empfohlen
Rangfolge