我需要在 OpenCV 中计算一个扭曲矩阵,表示围绕给定轴的旋转。
围绕 Z 轴 -> 直截了当:我使用标准旋转矩阵
[cos(a) -sin(a) 0]
[sin(a) cos(a) 0]
[ 0 0 1]
这对于其他旋转并不那么明显,所以我尝试构建一个单应性,如 Wikipedia 上所述:
H = R - t n^T / d
我尝试围绕 X 轴进行简单的旋转,并假设相机和图像之间的距离是图像高度的两倍。
R是标准旋转矩阵
[1 0 0]
[0 cos(a) -sin(a)]
[0 sin(a) cos(a)]
n 是[0 0 1]
因为相机直接从 (0, 0, z_cam) 看图像
t是翻译,应该是[0 -2h*(sin(a)) -2h*(1-cos(a))]
d 是距离,每个定义是 2h。
所以,最终的矩阵是:
[1 0 0]
[0 cos(a) 0]
[0 sin(a) 1]
这看起来相当不错,当 a = 0 时,它是一个身份,而当 a = pi 时,它围绕 x 轴镜像。
然而,将这个矩阵用于透视扭曲并不会产生预期的结果,对于较小的 a 值,图像只是“过于扭曲”,并且很快就会消失。
那么,我做错了什么?
(注意:我已经阅读了很多关于这个主题的问题和答案,但都朝着相反的方向发展:我不想分解单应矩阵,而是构建一个,给定一个 3d 变换和一个“固定“相机或固定图像和移动相机)。
谢谢你。