首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV recoverPose相机坐标系

OpenCV recoverPose相机坐标系
EN

Stack Overflow用户
提问于 2019-05-08 17:08:53
回答 1查看 2.9K关注 0票数 2

我用下面的代码来估计单个摄像机的平移和旋转。

代码语言:javascript
复制
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坐标。

我收集所有的翻译在几个帧,并产生一个路径,相机走了这样。

代码语言:javascript
复制
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平面绘制平移图。

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

这是完全错误的。

但是,如果我写这个代替

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

我得到以下信息(在做了一些平均处理之后)

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

  1. 另一个,也许是无关的问题是,报道的Z-翻译似乎呈线性下降,这是没有意义的。

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

EN

回答 1

Stack Overflow用户

发布于 2019-05-21 09:54:45

实际上,在一开始,您的方法并没有产生真正的路径。recoverPose()生成的转换t始终是一个单位向量。因此,在你的“路径”中,每一帧都是从前一帧移动1“米”。正确的方法是: 1)初始化:( featureMatch,findEssentialMatrix,recoverPose),2)跟踪:(三角,featureMatch,solvePnP)。如果您想更深入地挖掘,查找有关单目Visual的教程将有帮助。

其次,你可能把相机坐标系和世界坐标系搞砸了。如果你想要绘制轨道,你可以使用世界坐标系,而不是相机坐标系。此外,recoverPose()的结果也在世界坐标系中。世界坐标系是:x轴指向右边,y轴指向前方,z轴指向up.Thus,当你想绘制‘鸟瞰’时,你应该沿着X平面绘制正确的图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56045839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档