加速光流算法(如果适用)Python OpenCV
Speed Up Optical Flow algorithm (If applicable) Python OpenCV
我遇到了这个有趣的情况 (Speeding up optical flow (createOptFlow_DualTVL1)),但它不符合我的需要。我的一般问题是我想尽可能加快以下代码(如果适用)。请记住,我希望帧为灰度并将它们调整为 height = 300
,同时保持宽高比锁定。此外,我想从该视频中每秒采样 2 帧,因此我假设每个视频都在 30fps
左右。最后想用TV-L1光流算法。有没有办法提高这个算法,因为对于一个 1 分钟的视频,估计光流大约需要 3 分钟,这对我的需求来说太耗时了。
提前致谢,
埃文
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()
对于 cv2 版本“'4.1.0'”:
根据下面对超参数的解释,下面的代码速度更快但不太准确。根据要求调整这些参数以解决速度与准确性 trade-off。
optical_flow= cv2.optflow.DualTVL1OpticalFlow_create(nscales=1,epsilon=0.05,warps=1)
flow = optical_flow.calc(new_prvs, new_nxt, None)
int "nscales" :用于创建图像金字塔的比例数。
int "warps" :每个尺度的扭曲数。表示每个尺度计算 I1(x+u0) 和 grad( I1(x+u0) ) 的次数。这是确保方法稳定性的参数。它还会影响运行时间,所以它是速度和准确性之间的折衷。
double epsilon : 数值方案中使用的停止标准阈值,它是精度和 运行 时间之间的 trade-off。较小的值将以较慢的收敛速度为代价产生更准确的解决方案。
可以找到其他要调整的参数here
我遇到了这个有趣的情况 (Speeding up optical flow (createOptFlow_DualTVL1)),但它不符合我的需要。我的一般问题是我想尽可能加快以下代码(如果适用)。请记住,我希望帧为灰度并将它们调整为 height = 300
,同时保持宽高比锁定。此外,我想从该视频中每秒采样 2 帧,因此我假设每个视频都在 30fps
左右。最后想用TV-L1光流算法。有没有办法提高这个算法,因为对于一个 1 分钟的视频,估计光流大约需要 3 分钟,这对我的需求来说太耗时了。
提前致谢, 埃文
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()
对于 cv2 版本“'4.1.0'”:
根据下面对超参数的解释,下面的代码速度更快但不太准确。根据要求调整这些参数以解决速度与准确性 trade-off。
optical_flow= cv2.optflow.DualTVL1OpticalFlow_create(nscales=1,epsilon=0.05,warps=1)
flow = optical_flow.calc(new_prvs, new_nxt, None)
int "nscales" :用于创建图像金字塔的比例数。
int "warps" :每个尺度的扭曲数。表示每个尺度计算 I1(x+u0) 和 grad( I1(x+u0) ) 的次数。这是确保方法稳定性的参数。它还会影响运行时间,所以它是速度和准确性之间的折衷。
double epsilon : 数值方案中使用的停止标准阈值,它是精度和 运行 时间之间的 trade-off。较小的值将以较慢的收敛速度为代价产生更准确的解决方案。
可以找到其他要调整的参数here