2

我需要找到相机的姿势(旋转矩阵+平移向量),为此我正在使用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?(当然,理想情况下,最好首先使坐标系匹配)。

任何帮助都将受到欢迎!

4

0 回答 0