我想知道两个给定视频帧的大小差异有多大。我的目标是计算一个单一值来显示帧内物体移动的速度。
我可以计算以下光流矩阵:HSV和幅度矩阵。但我不知道如何从这些矩阵中计算平均总移动幅度。该如何计算?
def optical_flow(one, two):
one_g = cv2.cvtColor(one, cv2.COLOR_RGB2GRAY)
two_g = cv2.cvtColor(two, cv2.COLOR_RGB2GRAY)
hsv = np.zeros((120, 320, 3))
# set saturation
hsv[:,:,1] = cv2.cvtColor(two, cv2.COLOR_RGB2HSV)[:,:,1]
# obtain dense optical flow paramters
flow = cv2.calcOpticalFlowFarneback(one_g, two_g, flow=None,
pyr_scale=0.5, levels=1, winsize=15,
iterations=2,
poly_n=5, poly_sigma=1.1, flags=0)
# convert from cartesian to polar
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
# hue corresponds to direction
hsv[:,:,0] = ang * (180/ np.pi / 2)
# value corresponds to magnitude
hsv[:,:,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
# convert HSV to int32's
hsv = np.asarray(hsv, dtype= np.float32)
rgb_flow = cv2.cvtColor(hsv,cv2.COLOR_HSV2RGB)
return rgb_flow
< p > rgb_flow
是一个 3D 数组,样式如下:
[[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]
...
[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]]
而 mag
矩阵就像这样的 2D 数组:
[[3.2825139e-03 3.9561605e-03 4.8938910e-03 ... 3.7310597e-02
3.2986153e-02 2.5520157e-02]
[4.9569397e-03 6.3276174e-03 7.7017904e-03 ... 3.9564677e-02
3.2582227e-02 2.6329078e-02]
...
[6.9548332e-06 8.3683852e-05 6.0906638e-03 ... 8.3484064e-04
6.4721738e-04 2.9505073e-04]]