5

I am trying to implement monocular (single camera) Visual Odometry in OpenCV Python. Wikipedia gives the commonly used steps for approach here http://en.wikipedia.org/wiki/Visual_odometry I calculated Optical Flow using Lucas Kanade tracker. The code is given here http://docs.opencv.org/trunk/doc/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html Step 4 on Wiki says "Check flow field vectors for potential tracking errors and remove outliers". How do I do this in OpenCV (python)? What algorithm/function should I use? And what about steps 5 and 6? I read somewhere (see third comment http://opencv-users.1802565.n2.nabble.com/optical-flow-with-kalman-filter-td6578617.html) that Kalman Filter would not give any improvement in performance if Lucas Kanade is used.

Clive
  • 1,137
  • 7
  • 19
  • 28
  • Can you rebuild opencv? – Martijn van Wezel Aug 19 '15 at 10:57
  • http://stackoverflow.com/questions/7388893/extract-transform-and-rotation-matrices-from-homography?rq=1 – Martijn van Wezel Aug 19 '15 at 10:58
  • I'm still a beginner, but I can say one say. As far as I know, removing outliers are done by RANSAC algorithm. And there's many algorithms in OpenCV that use RANSAC method, given to it as a flag. I don't actually think that you need to implement all these stuff by yourself, maybe there's a function in OpenCV for the whole algorithm .. maybe not. I'm still searching. If I reached something, I'd let you know. – Radwa Khattab Feb 22 '20 at 10:01

1 Answers1

1

As for removing vectors with errors, you should filter keypoints in accordance with status returned by calcOpticalFlowPyrLK. The following code can help you with it:

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

As for steps 5 and 6, find essential matrix and estimate pose using it (openCV functions findEssentialMat and recoverPose. You can look through these examples:

And read this two posts:

I.R.
  • 442
  • 1
  • 7
  • 16