使用OpenCV的视觉测距

时间:2014-12-07 07:57:52

标签: 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,卡尔曼滤波器不会对性能有任何改进。

1 个答案:

答案 0 :(得分:0)

对于删除有错误的向量,应根据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

关于第5步和第6步,找到基本矩阵并使用它估计姿势(openCV函数findEssentialMatrecoverPose。您可以浏览以下示例:

并阅读这两篇文章: