如何在OpenCV中计算光流大小

3

我想知道两个给定视频帧的大小差异有多大。我的目标是计算一个单一值来显示帧内物体移动的速度。

我可以计算以下光流矩阵: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]]

你需要更深入地思考你所询问的问题。你想让这个单一数字代表什么?平均光流?最大光流?还是你想猜测相机移动了多少? - Kyle Pena
所有场景帧的平均值可能是一个快速移动场景的良好代表。 - Tina J
1个回答

2
import numpy as np
np.mean(mag)

这将给你平均幅度。尽管numpy数组mag是二维的,但np.mean默认情况下将其缩减为单个数字。此外,由于均值对异常值敏感,因此中位数可能更适合您的需求。"最初的回答"
np.median(mag)

1
虽然这段代码可能/可能不会解决问题,但包括解释如何以及为什么解决问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接