Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV摄像机坐标系_Python_Opencv_Camera Calibration_Robotics - Fatal编程技术网

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)
所以,我有一些问题

  • OpenCV摄影机坐标系表明,如果要查看摄影机路径的2D“自上而下”视图,应沿X-Z平面绘制平移
  • plt.plot(路径[:,0],路径[:,2])

    这是完全错误的

    然而,如果我写这篇文章

    plt.plot(路径[:,0],路径[:,1])

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

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

  • 另一个可能不相关的问题是,报告的Z平移似乎呈线性减少,这并没有真正意义

  • 我很确定我的代码中有一个bug,因为这些问题看起来是系统性的,但我想确保我对坐标系的理解是正确的,这样我就可以限制调试的搜索空间。

    实际上,在一开始,你的方法并没有生成真正的路径。recoverPose()生成的平移t始终是单位向量。因此,在您的“路径”中,每一帧与前一帧的距离正好为1米。正确的方法是,1)初始化:(featureMatch,FindSentialMatrix,recoverPose),然后2)跟踪:(TriangalUate,featureMatch,solvePnP)。如果你想更深入地挖掘,找到关于单目视觉SLAM的教程会有所帮助

    其次,你可能弄乱了摄像机坐标系和世界坐标系。如果要绘制轨迹,可以使用世界坐标系而不是摄影机坐标系。此外,recoverPose()的结果也在世界坐标系中。世界坐标系是:x轴指向右侧,y轴指向前方,z轴指向上方。因此,当您想要绘制“鸟瞰图”时,正确的做法是沿x-y平面绘制。

    请查看其中引用的参考资料。这可能会给你一个暗示。