I came across this interesting situation (Speeding up optical flow (createOptFlow_DualTVL1)) but it doesn't apply to my needs. My general problem is I want to speed up as much as possible the following code if it is applicable. Keep in mind, I want the frames to be grayscale and resize them to height = 300
while keeping aspect ratio locked. Also, I want to sample 2 frames per second from that video so I assume every video to be around 30fps
. Finally, I want to use the TV-L1 optical flow algorithm. Is there a way to boost this algorithm because for a 1-minute video it takes around 3 minutes to estimate the optical flow which is too time-consuming for my needs.
Thanks in advance, Evan
import math, imutils, cv2
print ("Entering Optical Flow Module...")
cap = cv2.VideoCapture(video_path)
current_framerate = cap.get(5)
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
prvs = imutils.resize(prvs, height = 300)
all_frames_flow=list()
while(cap.isOpened()):
frameId = cap.get(1)
ret, frame2 = cap.read()
if ret == True:
if (frameId % (math.floor(current_framerate)/2)==0): # assume videos are 30 fps and we want only 2 frames per second.
next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
next = imutils.resize(next, height = 300)
optical_flow = cv2.DualTVL1OpticalFlow_create()
flow = optical_flow.calc(prvs, next, None)
all_frames_flow.append(flow)
prvs = next
else:
continue
else:
break
cap.release()