opencv提供摄像机姿势-rvec和tvec-坐标系不匹配

opencv提供摄像机姿势-rvec和tvec-坐标系不匹配,opencv,camera-calibration,coordinate-transformation,Opencv,Camera Calibration,Coordinate Transformation,我需要找到相机的姿势(旋转矩阵+平移向量),为此我使用了cv2.solvePnP(),但从照片中得到的结果不匹配 为了调试,我(使用numpy)创建了一个“调试3d场景”,由一些对象点(正方形的四个角)、一些相机点(焦点、主点和虚拟投影平面的四个角)和参数(焦距、初始方向)组成 然后,我将三轴旋转矩阵相乘,构造一个通用旋转矩阵,将此通用旋转应用于相机(numpy.dot()),在虚拟投影平面中投影对象点(线平面相交算法),并计算平面内二维坐标(点线距离)到投影平面轴 这样做之后(objectpo

我需要找到相机的姿势(旋转矩阵+平移向量),为此我使用了
cv2.solvePnP()
,但从照片中得到的结果不匹配

为了调试,我(使用numpy)创建了一个“调试3d场景”,由一些对象点(正方形的四个角)、一些相机点(焦点、主点和虚拟投影平面的四个角)和参数(焦距、初始方向)组成

然后,我将三轴旋转矩阵相乘,构造一个通用旋转矩阵,将此通用旋转应用于相机(
numpy.dot()
),在虚拟投影平面中投影对象点(线平面相交算法),并计算平面内二维坐标(点线距离)到投影平面轴

这样做之后(objectpoints通过rotationmatrix发送到imagepoints),我将imagepoints和objectpoints发送到
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关联起来?(当然,理想情况下,最好是首先使坐标系匹配)


欢迎提供任何帮助!

为什么不首先使用Rodrigues构建通用旋转矩阵?如果所有从旋转向量到旋转矩阵的转换都发生在opencv内部,那么您只需要担心一组约定。如果这解决了问题,那么我们就确切地知道问题所在(旋转顺序)否则它就在别处。为什么不先用Rodrigues构造一般的旋转矩阵呢?如果所有从旋转向量到旋转矩阵的转换都发生在opencv内部,那么你只需要担心一组约定。如果这解决了问题,那么我们就确切地知道问题所在(轮换顺序)否则在别处。