我需要为相机找到姿势(旋转矩阵+平移矢量),为此我使用的是cv2.solvePnP()
,但我从照片中得到的结果不匹配。
为了调试,我创建了(用numpy)一个由一些对象点(一个正方形的四个角)组成的“调试3d场景”,一些摄像机点(焦点,主点和虚拟投影平面的四个角) )和参数(焦距,初始方向)。
然后,我通过乘以三个轴旋转矩阵构造一般旋转矩阵,将此一般旋转应用于摄像机(numpy.dot()
),投影虚拟投影平面中的对象点(线 - 平面交点算法),并计算到投影平面轴的平面内2D坐标(点线距离)。
执行此操作(通过rotationmatrix对象指向图像点)后,我将图像点和对象点提供给cv2.Rodrigues(cv2.solvePnP(...))
并获得与我使用的矩阵“不完全相同”的矩阵,仅仅因为换位和一些元素与相反的信号(负面与正面),尊重这种关系:
solvepnp_rotmatrix = my_original_matrix.transpose * [ 1 1 1]
[ 1 1 -1]
[-1 -1 1]
尽管旋转矩阵不匹配是可以解决的,但翻译矢量会给出对我来说没有意义的坐标。
我怀疑我的3D模型(旋转度,轴方向,旋转顺序)与opencv使用的模型之间存在不匹配:
我的问题是:
鉴于旋转矩阵的项是相同的,只有转置并且在某些方面具有不同的信号,我是否可能会混淆openCV
约定(旋转度,旋转顺序,轴方向)?我怎样才能发现哪一个?
另外,有没有办法将我的手工翻译矢量与solvePnP
返回的tvec联系起来? (当然,理想情况下,最好的方法是首先使坐标系匹配)。
欢迎任何帮助!