flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 5, 15, 5, 5, 1.1, 0) # 输出是x,y方向的矢量
# a=print('a',flow[:,:,0])
# b=print('b',flow[:,:,1])
c=[]
def hoof(flow): # flow.shape=[720.1280.2]
l = np.zeros(6)
for idx in flow:
for j in idx:
jz=np.sqrt((j[0])**2 + j[1]**2) # 幅值
jq=np.arctan(j[1]/j[0]) # 角度
if jq >= -180 and jq < -150:
l[5] += 1
elif jq >= -150 and jq < -120:
l[4] += 1
elif jq >= -120 and jq < -90:
l[3] += 1
elif jq >= -90 and jq < -60:
l[2] += 1
elif jq >= -60 and jq < -30:
l[1] += 1
elif jq >= -30 and jq < 0:
l[0] += 1
elif jq >= 0 and jq < 30:
l[0] += 1
elif jq >= 30 and jq < 60:
l[1] += 1
elif jq >= 60 and jq < 90:
l[2] += 1
elif jq >= 90 and jq < 120:
l[3] += 1
elif jq >= 120 and jq < 150:
l[4] += 1
elif jq >= 150 and jq < 180:
l[5] += 1
return l
对得到的稠密光流结果做一个直方图统计,x横轴按照每+-30度为一个区间,将360度化分为6个区间。y数轴为次数。
这里的问题是,使用简单的for循环和if语句来完成所有这些操作需要很长时间,想问问大家有没有 简化 或者 提速 的办法?
整个 if then 循环可以简化为:
l[abs(jq//30] += 1
回答不易,求求您点赞关注哦
看起来您正在使用嵌套循环迭代二维数组 ( flow) 的元素并l根据flow. 这对于大型数组来说可能很耗时,因为循环的时间复杂度为 O(n^2)。
简化和加速此代码的一种方法是使用numpy库,它提供了处理大型数组的高效函数。以下是如何使用重写hoof函数的示例numpy:
import numpy as np
def hoof(flow):
# Compute the magnitude and angle of the flow vectors
magnitude = np.sqrt(flow[:,:,0]**2 + flow[:,:,1]**2)
angle = np.arctan2(flow[:,:,1], flow[:,:,0])
# Convert the angle to degrees
angle = np.rad2deg(angle)
# Initialize the histogram with zeros
l = np.zeros(6)
# Increment the appropriate bin for each angle
l[(angle >= -180) & (angle < -150)] += 1
l[(angle >= -150) & (angle < -120)] += 1
l[(angle >= -120) & (angle < -90)] += 1
l[(angle >= -90) & (angle < -60)] += 1
l[(angle >= -60) & (angle < -30)] += 1
l[(angle >= -30) & (angle < 0)] += 1
l[(angle >= 0) & (angle < 30)] += 1
l[(angle >= 30) & (angle < 60)] += 1
l[(angle >= 60) & (angle < 90)] += 1
l[(angle >= 90) & (angle < 120)] += 1
l[(angle >= 120) & (angle < 150)] += 1
l[(angle >= 150) & (angle < 180)] += 1
return l
这个版本的hoof函数应该比原始版本更快,因为它使用numpy函数对数组执行向量化操作,而不是循环遍历元素。