我需要找到相机的姿势(旋转矩阵+平移向量),为此我正在使用cv2.solvePnP()
,但我从照片中得到的结果不匹配。
为了调试,我(使用 numpy)创建了一个“调试 3d 场景”,由一些对象点(正方形的四个角)、一些相机点(焦点、主点和虚拟投影平面的四个角)和参数组成(焦距,初始方向)。
然后,我通过乘以三个轴旋转矩阵来构造一个通用旋转矩阵,将这个通用旋转应用于相机(numpy.dot()
),将对象点投影到虚拟投影平面(线平面相交算法),并计算平面内二维坐标(点线距离)到投影平面轴。
这样做之后(通过旋转矩阵将对象点指向图像点),我将图像点和对象点输入cv2.Rodrigues(cv2.solvePnP(...))
并得到一个与我使用的矩阵“不太相同”的矩阵,只是因为转置和一些具有相反信号的元素(负与正) ,尊重这种关系:
solvepnp_rotmatrix = my_original_matrix.transpose * [ 1 1 1]
[ 1 1 -1]
[-1 -1 1]
虽然旋转矩阵不匹配是“可解决的”这个黑客,但翻译向量给出的坐标对我来说没有意义。
我怀疑我的 3D 模型(惯用手、轴方向、旋转顺序)与 opencv 使用的模型不匹配:
- 我使用类似OpenGL的坐标系(X向右增加,Y向上增加,Z向观察者增加;
- 我以对我更有意义的顺序应用了旋转(所有右手,首先围绕全局 Z,然后围绕全局 X,然后围绕全局 Y);
- 图像平面位于物体和相机焦点之间(虚拟投影平面,而不是真实/CCD);
- 我的图像平面(虚拟 CCD)的原点是左下角(Xpix 向右增加,Ypx 向上增加。
我的问题是:
鉴于旋转矩阵的项是相同的,只是转置并且在某些术语中具有不同的信号,我是否可能混淆了一些openCV
约定(用手习惯、旋转顺序、轴方向)?我怎样才能发现是哪一个?
另外,有没有办法将我的手工翻译向量与返回的 tvec 联系起来solvePnP
?(当然,理想情况下,最好首先使坐标系匹配)。
任何帮助都将受到欢迎!