opencv给相机姿势 - rvec和tvec - 坐标系不匹配

时间:2012-10-03 21:18:03

标签: opencv camera-calibration coordinate-transformation

我需要为相机找到姿势(旋转矩阵+平移矢量),为此我使用的是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使用的模型之间存在不匹配:

  • 我使用类似OpenGL的坐标系(X向右增加,Y向上增加,Z向观察者增加;
  • 我按照对我更有意义的顺序应用旋转(全右手,首先围绕全局Z,然后围绕全局X,然后围绕全局Y);
  • 图像平面位于物体和相机焦点之间(虚拟投影平面,而不是真实/ CCD);
  • 我的图像平面(虚拟CCD)的原点是左下角(Xpix向右增加,Ypx向上增加。

我的问题是:

鉴于旋转矩阵的项是相同的,只有转置并且在某些方面具有不同的信号,我是否可能会混淆openCV约定(旋转度,旋转顺序,轴方向)?我怎样才能发现哪一个?

另外,有没有办法将我的手工翻译矢量与solvePnP返回的tvec联系起来? (当然,理想情况下,最好的方法是首先使坐标系匹配)。

欢迎任何帮助!

0 个答案:

没有答案