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内部,那么你只需要担心一组约定。如果这解决了问题,那么我们就确切地知道问题所在(轮换顺序)否则在别处。