Python OpenCV摄像机坐标系
我使用下面的代码估算单个摄影机的平移和旋转Python OpenCV摄像机坐标系,python,opencv,camera-calibration,robotics,Python,Opencv,Camera Calibration,Robotics,我使用下面的代码估算单个摄影机的平移和旋转 E, mask = cv2.findEssentialMat(k1, k2, focal = SCALE_FACTOR * 2868 pp = (1920/2 * SCALE_FACTOR, 1080/2 * SCALE_FACTOR), method = cv2.RANSAC,
E, mask = cv2.findEssentialMat(k1, k2,
focal = SCALE_FACTOR * 2868
pp = (1920/2 * SCALE_FACTOR, 1080/2 * SCALE_FACTOR),
method = cv2.RANSAC,
prob = 0.999,
threshold = 1.0)
points, R, t, mask = cv2.recoverPose(E, k1, k2)
其中,k1
和k2
是我的匹配关键点集,它们是Nx2矩阵,其中第一列是x坐标,第二列是y坐标
我收集了几个帧上的所有平移,并生成了一条相机像这样移动的路径
def generate_path(rotations, translations):
path = []
current_point = np.array([0, 0, 0])
for R, t in zip(rotations, translations):
path.append(current_point)
# don't care about rotation of a single point
current_point = current_point + t.reshape((3,)
return np.array(path)
所以,我有一些问题
plt.plot(路径[:,0],路径[:,2])
这是完全错误的
然而,如果我写这篇文章
plt.plot(路径[:,0],路径[:,1])
我得到以下结果(在做了一些平均后)
这条路基本上是完美的。
所以,也许我误解了cv2.recoverPose所使用的坐标系约定?为什么相机路径的“鸟瞰视图”应该沿着XY平面而不是XZ平面
我很确定我的代码中有一个bug,因为这些问题看起来是系统性的,但我想确保我对坐标系的理解是正确的,这样我就可以限制调试的搜索空间。实际上,在一开始,你的方法并没有生成真正的路径。recoverPose()生成的平移t始终是单位向量。因此,在您的“路径”中,每一帧与前一帧的距离正好为1米。正确的方法是,1)初始化:(featureMatch,FindSentialMatrix,recoverPose),然后2)跟踪:(TriangalUate,featureMatch,solvePnP)。如果你想更深入地挖掘,找到关于单目视觉SLAM的教程会有所帮助 其次,你可能弄乱了摄像机坐标系和世界坐标系。如果要绘制轨迹,可以使用世界坐标系而不是摄影机坐标系。此外,recoverPose()的结果也在世界坐标系中。世界坐标系是:x轴指向右侧,y轴指向前方,z轴指向上方。因此,当您想要绘制“鸟瞰图”时,正确的做法是沿x-y平面绘制。请查看其中引用的参考资料。这可能会给你一个暗示。