Ich versuche, Code zu bekommen, der eine perspektivische Transformation (in diesem Fall eine 3D-Rotation) auf einem Bild durchführt.
%Vor%Wenn ich um die z-Achse rotiere, funktioniert alles wie erwartet, aber die Drehung um die x- oder y-Achse scheint komplett aus. Ich muss um Winkel drehen, die so klein wie pi / 200 sind, bevor ich anfange, Ergebnisse zu erhalten, die überhaupt vernünftig scheinen. Irgendeine Idee, was könnte falsch sein?
Erstellen Sie zuerst die Rotationsmatrix des Formulars
%Vor%Wenn Sie diese Koordinatentransformation anwenden, erhalten Sie eine Rotation um den Ursprung.
Wenn Sie sich stattdessen um die Bildmitte drehen möchten, müssen Sie zuerst die Bildmitte verschieben zum Ursprung, dann wenden Sie die Rotation an, und dann verschieben Sie alles zurück. Sie können dies mit a tun Übersetzungsmatrix:
%Vor%Die Transformationsmatrix für Translation, Rotation und inverse Translation wird dann:
%Vor%Ich werde ein wenig darüber nachdenken müssen, wie ich die Skew-Matrix mit der 3D-Transformation in Beziehung setzen kann. Ich erwarte, dass der einfachste Weg darin besteht, eine 4D-Transformationsmatrix zu erstellen und diese dann zurück zu 2D-homogenen Koordinaten zu projizieren. Aber für jetzt, die allgemeine Form der Skew-Matrix:
%Vor% Die Werte x_skew
und y_skew
sind typischerweise winzig (1e-3 oder weniger).
Hier ist der Code:
%Vor%Und die Ausgabe:
Ich verstehe nicht, wie Sie Ihre Rotationsmatrix aufbauen. Es scheint mir ziemlich kompliziert zu sein. In der Regel wird eine Nullmatrix erstellt, indem 1
auf nicht benötigte Achsen und die allgemeine sin
, cos
, -cos
, sin
in die beiden verwendeten Dimensionen gesetzt wird. Dann multiplizieren Sie alle diese zusammen.
Woher hast du das np.eye(3) + np.sin(angle) * skew(axis) + (1 - np.cos(angle)) * skew(axis).dot(skew(axis))
Konstrukt?
Versuchen Sie, die Projektionsmatrix aus grundlegenden Bausteinen zu erstellen. Die Konstruktion einer Rotationsmatrix ist ziemlich einfach und "rotationmatrix dot skewmatrix" sollte funktionieren.
Sie müssen jedoch eventuell auf das Rotationszentrum achten. Ihr Bild wird wahrscheinlich an einer virtuellen Position von 1 auf der Z-Achse platziert, sodass es sich durch Drehen um x oder y ein wenig bewegt. Sie müssten also eine Übersetzung verwenden, damit z 0 wird, dann drehen und dann zurück übersetzen. (Übersetzungsmatrizen in affinen Koordinaten sind auch ziemlich einfach. Siehe Wikipedia: Ссылка )
Tags und Links python opencv image-processing