Kanade Optical Flow Algorithm Lucas Tomasi (KLT) in Python [closed]

0

Hello. I searched all over the internet and could not find it.

Does anyone have an alternative to extract features in images with the Kanade Lucas Tomasi (KLT) algorithm in python?

    
asked by anonymous 02.12.2018 / 14:18

1 answer

2

OpenCV works with this (or with variants of) algorithm.

  

Sparse optical flow: These algorithms, like the Kanade-Lucas-Tomashi (KLT) feature tracker, track the location of a few feature points in an image.

The example creates a simple application that tracks some points in a video. In order to decide which points are used the cv.goodFeaturesToTrack() function, the first frame is taken, some points (in the corners) are detected with the Shi-Tomasi Corner Detector function, then these points are iteratively traced through the Lucas-Kanade optical flow. The previous frame and points, and the next frame are passed to the cv.calcOpticalFlowPyrLK() function. Return the next points and some status numbers that can be 1 if the next point is found, otherwise zero.

See the code:

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('slow.flv')
# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 100,
                       qualityLevel = 0.3,
                       minDistance = 7,
                       blockSize = 7 )
# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15,15),
                  maxLevel = 2,
                  criteria = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))
# Create some random colors
color = np.random.randint(0,255,(100,3))
# Take first frame and find corners in it
ret, old_frame = cap.read()
old_gray = cv.cvtColor(old_frame, cv.COLOR_BGR2GRAY)
p0 = cv.goodFeaturesToTrack(old_gray, mask = None, **feature_params)
# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)
while(1):
    ret,frame = cap.read()
    frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # calculate optical flow
    p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
    # Select good points
    good_new = p1[st==1]
    good_old = p0[st==1]
    # draw the tracks
    for i,(new,old) in enumerate(zip(good_new,good_old)):
        a,b = new.ravel()
        c,d = old.ravel()
        mask = cv.line(mask, (a,b),(c,d), color[i].tolist(), 2)
        frame = cv.circle(frame,(a,b),5,color[i].tolist(),-1)
    img = cv.add(frame,mask)
    cv.imshow('frame',img)
    k = cv.waitKey(30) & 0xff
    if k == 27:
        break
    # Now update the previous frame and previous points
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1,1,2)
cv.destroyAllWindows()
cap.release()

Result:

Source: link

    
02.12.2018 / 16:01