使用 OpenCV 的视觉里程计

Cli*_*ive 5 python opencv

我正在尝试在 OpenCV Python 中实现单目(单相机)视觉里程计。维基百科在这里给出了常用的方法步骤http://en.wikipedia.org/wiki/Visual_odometry 我使用 Lucas Kanade 跟踪器计算了光流。代码在这里给出http://docs.opencv.org/trunk/doc/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html Wiki上的步骤4说“检查流场向量是否存在潜在的跟踪错误并删除异常值”。我如何在 OpenCV (python) 中执行此操作?我应该使用什么算法/函数?那么第 5 步和第 6 步呢?我在某处读到(请参阅第三条评论http://opencv-users.1802565.n2.nabble.com/optical-flow-with-kalman-filter-td6578617.html)如果卢卡斯·卡纳德(Lucas Kanade)卡尔曼滤波器不会在性能上提供任何改进用来。

I.R*_*.R. 1

对于删除有错误的向量,您应该根据 calcOpticalFlowPyrLK 返回的状态过滤关键点。下面的代码可以帮助你:

def featureTracking(image_ref, image_cur, px_ref):
    kp2, st, err = cv2.calcOpticalFlowPyrLK(image_ref, image_cur, px_ref, None, **lk_params)  # shape: [k,2] [k,1] [k,1]

    st = st.reshape(st.shape[0])
    kp1 = px_ref[st == 1]
    kp2 = kp2[st == 1]

    return kp1, kp2
Run Code Online (Sandbox Code Playgroud)

至于步骤 5 和 6,找到基本矩阵并使用它估计姿势(openCV 函数findEssentialMat和 )recoverPose。您可以查看这些示例:

并阅读这两篇文章: