I would like to track an object using optical flow.
Since the screen is filled with past loci, I would like to delete the locus at 10 second intervals and implement repeated drawing.
I would appreciate it if you could teach me.
import cv2 import numpy as np #Video capture cap = cv2.VideoCapture ("C: /github/sample/python/opencv/video/input2.mp4") #Shi-Tomasi method parameters (corners: detect the corners of objects as feature points) ft_params = dict (maxCorners = 100, #maximum number of feature points qualityLevel = 0.3, # Threshold for selecting feature points. The higher the threshold, the more carefully selected and decrease the number of feature points. minDistance = 7, # Minimum distance between feature points (points close to feature points are not feature points) blockSize = 7) # Block (peripheral area) size used to calculate feature points # Lucas-Kanade method parameters (for tracking) lk_params = dict (winSize = (15, 15), #peripheral area size used to calculate optical flow estimation maxLevel = 2, # Number of pyramids (default 0: 2 uses up to 1/4 image) criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # Search algorithm termination condition # Get the first frame and convert to ray scale ret, frame = cap.read () gray1 = cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY) # Shi-Tomasi method to detect feature points ft1 = cv2.goodFeaturesToTrack ( gray1, mask = None, ** ft_params) Generate an array for #mask mask = np.zeros_like (frame) #Repeat until the end of the video while (cap.isOpened ()): # Get the next frame and convert it to grayscale ret, frame = cap.read () gray2 = cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY) # Lucas-Kanade method for optical flow wp calculation of feature points between frames ft2, status, err = cv2.calcOpticalFlowPyrLK ( gray1, gray2, ft1, None, ** lk_params) # Acquire the feature point that detected the optical flow (if 1 is detected) good1 = ft1 [status == 1] # 1st frame good2 = ft2 [status == 1] # 2nd frame #Draw feature points and optical flow on frame mask for i, (pt2, pt1) in enumerate (zip (good2, good1)): x1, y1 = pt1.ravel () # Feature point coordinates of the first frame x2, y2 = pt2.ravel () # 2nd frame feature point coordinates # Draw a trajectory (draw on a mask to keep past tracks) mask = cv2.line (mask, (x2, y2), (x1, y1), [0, 0, 200], 2) # Draw optical flow in the current frame frame = cv2.circle (frame, (x2, y2), 5, [0, 0, 200], -1) # Logical product of frame and mask (composite) img = cv2.add (frame, mask) # Display in window cv2.imshow ('mask', img) #Preparing the next frame and points gray1 = gray2.copy () # Set next frame as first frame ft1 = good2.reshape (-1, 1, 2) # Set the next point as the first point Ends halfway when the # q key is pressed if cv2.waitKey (30)&0xFF == ord ('q'): break # End processing cv2.destroyAllWindows () cap.release ()
Answer # 1
maskIf you are displaying the past trajectory by drawing a line on
Every 10 seconds
maskIt would be better to initialize the contents of (to the state where no line is drawn).