in video_processing/modules/optical_flow.py [0:0]
def compute_lk_optical_flow(frames):
# params for ShiTomasi corner detection
maxCorners = 50
feature_params = dict(maxCorners=maxCorners, qualityLevel=0.3, minDistance=7, blockSize=7)
# Parameters for lucas kanade optical flow
lk_params = dict(
winSize=(15, 15),
maxLevel=2,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03),
)
# Create some random colors
color = np.random.randint(0, 255, (maxCorners, 3))
# Take first frame and find corners in it
old_frame = frames[0]
old_gray = cv2.cvtColor(np.array(old_frame), cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)
# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)
for frame in frames[1:]:
frame_gray = cv2.cvtColor(np.array(frame), cv2.COLOR_BGR2GRAY)
# calculate optical flow
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
# Select good points
if p1 is not None:
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 = cv2.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2)
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1, 1, 2)
return mask