繁体   English   中英

OpenCV分解投影矩阵欧拉角方向错误?

[英]OpenCV Decompose Projection Matrix euler angle wrong direction?

情况:我正在尝试估计头部姿势。 我已经校准了我的相机并获得了相机矩阵。 我有一个对应于图像点的 3D 模型。 我找到姿势并获得旋转和平移向量:

_, rvec, tvec = cv2.solvePnP(model_points, image_points, camera_matrix, dist_coeffs, flags=...)

然后我从旋转向量中获得旋转矩阵:

rotation_matrix, _ = cv2.Rodrigues(rvec)

现在,我决定研究欧拉角。 我创建投影矩阵如下:

projection_matrix = camera_matrix.dot(np.hstack((rotation_matrix, tvec)))

所以我的投影矩阵现在是 3x4。 然后我得到欧拉角:

angles = cv2.decomposeProjectionMatrix(projection_matrix)[-1]

问题:我在这篇文章中找到了另一种获得欧拉角的方法( Python Opencv SolvePnP 产生错误的平移向量),根据作者的说法,它应该给出与我的角度相同的结果(就像对它们所做的那样):

 y_rot = math.asin(rotation_matrix[2][0])
 x_rot = math.acos(rotation_matrix[2][2]/math.cos(y_rot))
 z_rot = math.acos(rotation_matrix[0][0]/math.cos(y_rot))
 y_rot_angle = y_rot *(180/3.1415)
 x_rot_angle = x_rot *(180/3.1415)
 z_rot_angle = z_rot *(180/3.1415)

我从分解投影矩阵的角度给出了:

[164.17979619 19.45087415 1.95279565]

这个其他解决方案给出了什么:

[164.18463841290048, -19.451447820154847, 1.9528532437807946]

标量值相同,但 y 角旋转方向不同。 我想知道 - 也许我误解了什么?

我不知道具体哪种排列是您从矩阵中获取欧拉角的实现,但它与分解投影矩阵使用的排列不同。 这就是角度不同的原因。

如前所述,欧拉角始终取决于阶数。 有 12 种不同的排列。 有关详细信息,请参阅欧拉角

opencv 中的分解投影矩阵使用“XYZ”顺序作为其欧拉角表示。

pypi 上有不同的旋转库。 我在这个例子中使用了transforms3d。 我正在手动设置输入参数,并通过 transforms3d 包的 euler2mat 函数设置旋转矩阵。 我使用 XYZ 约定创建了一个旋转矩阵,例如滚动角 (X): 90°, 俯仰 (Y): 45° , yaw(X): 180°

from transforms3d import euler
from math import pi,radians
rotation_matrix = euler.euler2mat(radians(90), radians(45), 
    radians(180), 'sxyz')
tvec = np.zeros(3).reshape(1,3).T
camera_matrix = np.array([[1500,0,320],[0,1500,256],[0,0,1]])
projection_matrix = camera_matrix.dot(np.hstack((rotation_matrix, tvec)))
rot = cv2.decomposeProjectionMatrix(projection_matrix)

rotation_matrix(输入)和 rot[1](输出)相同(但仅使用正确的欧拉阶“sxyz”):

array([[-7.07106781e-01, -7.07106781e-01,  7.91668771e-17],
   [ 8.65956056e-17,  2.53632657e-17,  1.00000000e+00],
   [-7.07106781e-01,  7.07106781e-01,  4.32978028e-17]])

腐烂 [-1] 是:

[[90.         ]
 [ 45.        ]
 [ 180.        ]]

3d 旋转还有一些陷阱。 例如

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM