【问题标题】:OpenCV recoverPose camera coordinate systemOpenCV recoverPose 相机坐标系
【发布时间】:2019-05-08 17:08:53
【问题描述】:

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

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])

这是完全错误的。

但是,如果我写这个

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

我得到以下结果(在进行了一些平均之后)

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

  1. 另一个可能不相关的问题是报告的 Z 平移似乎呈线性下降,这实际上没有任何意义。

我很确定我的代码中存在错误,因为这些问题看起来是系统性的 - 但我想确保我对坐标系的理解是正确的,以便我可以限制搜索空间以进行调试。

【问题讨论】:

标签: python opencv camera-calibration robotics


【解决方案1】:

实际上,在一开始,您的方法并没有产生真正的路径。 recoverPose() 产生的平移 t 始终是一个单位向量。因此,在您的“路径”中,每一帧都从前一帧移动了 1 米。正确的方法是,1)初始化:(featureMatch,findEssentialMatrix,recoverPose),然后 2)track:(triangluate,featureMatch,solvePnP)。如果您想深入挖掘,查找有关单目视觉 SLAM 的教程会有所帮助。

其次,您可能弄乱了相机坐标系和世界坐标系。如果要绘制轨迹,您将使用世界坐标系而不是相机坐标系。此外,recoverPose() 的结果也在世界坐标系中。世界坐标系是:x 轴向右,y 轴向前,z 轴向上。因此,当您要绘制“鸟瞰图”时,沿 X-Y 绘制是正确的飞机。

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 2013-10-15
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多