OpenCV recoverPose 相机坐标系

3

使用以下代码估算单个相机的平移和旋转。

Original Answer翻译成"最初的回答"

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)

k1k2

是我的匹配关键点集合,它们是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)

所以,我有几个问题。
  1. OpenCV相机坐标系建议,如果我想查看相机路径的2D“俯视”视图,则应沿X-Z平面绘制平移。

plt.plot(path[:,0], path[:,2])

enter image description here

这是完全错误的。

但是,如果我改为写成这个样子:

plt.plot(path[:,0], path[:,1])

我得到了以下结果(进行了一些平均处理):

enter image description here

这条路径基本上是完美的。 那么,也许我误解了cv2.recoverPose使用的坐标系约定?为什么相机路径的“鸟瞰图”应该沿XY平面而不是XZ平面?

  1. 另一个可能无关的问题是,报告的Z平移呈线性下降趋势,这真的没有意义。

enter image description here

我很确定我的代码中有一个错误,因为这些问题似乎是系统性的-但我想确保我的坐标系的理解是正确的,这样我就可以限制调试的搜索空间。


1
请查看https://dev59.com/lZjga4cB1Zd3GeqPEAA6以及其中引用的参考资料。这可能会给你一些提示。 - undefined
1个回答

2
最初的回答:实际上,在最开始,您的方法并没有生成真正的路径。recoverPose() 产生的转换 t 总是一个单位向量。因此,在您的“路径”中,每个帧都恰好从前一帧移动1英尺。正确的方法是:1)初始化:(特征匹配、查找本质矩阵、恢复姿态),然后2)跟踪:(三角测量、特征匹配、解决PnP)。如果您想深入了解,可以查找单目视觉SLAM的教程。
其次,您可能已经搞混了相机坐标系和世界坐标系。如果您想绘制运动轨迹,应该使用世界坐标系而不是相机坐标系。除此之外,recoverPose() 的结果也是在世界坐标系下。世界坐标系为:x轴指向右,y轴指向前,z轴指向上。因此,当您想绘制“俯视图”时,应该沿着X-Y平面绘制。

你确定世界坐标系中的X轴和Y轴方向吗?因为至少在机器人领域,X轴指向前方,而Y轴指向左侧! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接