python - OpenCV restorePose相机坐标系

标签 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, 
                         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)

因此,我对此有一些疑问。
  • OpenCV摄像机坐标系建议,如果要查看摄像机路径的2D“自上而下” View ,则应沿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平面?
  • 另一个可能不相关的问题是,所报告的Z平移似乎呈线性下降,这实际上没有任何意义。

  • enter image description here

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

    最佳答案

    实际上,在一开始,您的方法并没有产生真实的路径。由recoverPose()产生的转换t始终是单位 vector 。因此,在您的“路径”中,每帧都距上一帧正好1个“米”。正确的方法是:1)初始化:(featureMatch,findEssentialMatrix,recoverPose),然后2)跟踪:(triangluate,featureMatch,solvePnP)。如果您想深入研究,找到有关Monocular Visual SLAM的教程会有所帮助。

    其次,您可能已经弄乱了相机坐标系和世界坐标系。如果要绘制轨迹,可以使用世界坐标系而不是摄影机坐标系。此外,recoverPose()的结果也位于世界坐标系中。世界坐标系是:x轴指向右,y轴指向前方,z轴指向上方,因此,当您要绘制``鸟瞰图''时,应该沿着XY方向绘制是正确的飞机。

    关于python - OpenCV restorePose相机坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045839/

    相关文章:

    python - tkFileDialog 的 askopenfilename 方法中的默认文件类型

    c++ - 如何在 OpenCV 中读取 ".jpg"图像序列?

    c++ - dlib vs opencv 什么时候使用

    python - Python 中的 HTTPS session 重用

    python - Pandas:将时间戳转换为日期时间

    c++ - 将OpenCV链接到Qt Creator

    c++ - HALCON 到 OpenCV 失真系数转换

    opencv - 立体矫正后图像变形

    python - Opencv:好的点匹配,但单应性错误

    python - 如何在 Django 中获取最后 10 项数据?