opencv / opencv

Open Source Computer Vision Library
https://opencv.org
Apache License 2.0
76.54k stars 55.64k forks source link

Om #25570

Closed motijimmy closed 1 month ago

motijimmy commented 1 month ago

import cv2 import numpy as np

cap = cv2.VideoCapture('https://github.com/opencv/opencv/assets/169485743/b9494f0a-7dfc-431d-85a1-c891d201a0ea

')

Set up the parameters 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=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

Take the first frame and find corners in it

ret, old_frame = cap.read() old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)

Create a random color to draw tracks

color = np.random.randint(0, 255, (100, 3))

while True:

Read the new frame

ret, frame = cap.read()
if not ret:
    break

frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Calculate optical flow
p1, st, err = cv2.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()
    frame = cv2.line(frame, (a, b), (c, d), color[i].tolist(), 2)
    frame = cv2.circle(frame, (a, b), 5, color[i].tolist(), -1)

# Display the result
cv2.imshow('Frame', frame)

# Update the previous frame and previous points
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1, 1, 2)

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

Release the capture and close any open windows

cap.release() cv2.destroyAllWindows()