OpenCV密集光流矩阵

时间:2016-07-04 17:45:58

标签: python opencv matrix opticalflow

我有另外一个关于OpenCVs Dense光流功能(Farneback)输出矩阵的问题。 我最近问了一个与此类似的问题

What is output from OpenCV's Dense optical flow (Farneback) function? How can this be used to build an optical flow map in Python?

从此我现在知道存储在矩阵中的值是特定像素相对于前一帧移动的X和Y距离。(如果我错了,请纠正我)。

我正在使用一个640x480像素的视频输入来计算光流,并且流矩阵的形状显示在下面的打印结果中,npte我在读取前两帧之后使用了一段时间来显示结构数组。

import cv2
import numpy as np

cap = cv2.VideoCapture("T5.avi")

ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

while (1):
    ret, frame2 = cap.read()
    next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)

    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 2, 5, 1.2, 0)
    print flow.shape
    print "Flow : : 0"
    print flow[:][:][0]
    print "Flow : : 1"
    print flow[:][:][1]
    break

这有以下输出:

(480, 640, 2)
Flow : : 0
[[ 0.01214151  0.22083586]
 [ 0.01184586  0.18637304]
 [ 0.01057486  0.15194368]
 ..., 
 [ 0.00064609 -0.00283471]
 [ 0.00046074  0.0047204 ]
 [ 0.000404   -0.00282944]]
Flow : : 1
[[ 0.0152726   0.35010788]
 [ 0.01538487  0.28910625]
 [ 0.01413684  0.22534071]
 ..., 
 [ 0.00082013 -0.00668656]
 [ 0.00060558  0.00633681]
 [ 0.00056752 -0.00331147]]

我现在想知道为什么每个地方都存储了2个值?是否存储了两个X和Y值?可能是初始和最终职位?或者组件是否具有虚构组件?

我已经做了很多搜索,但是找不到任何可以解释这一点的东西。

1 个答案:

答案 0 :(得分:4)

快速回答:对于每个像素,您将获得XY轴上的位移值。

我认为你在这里混合两种不同的东西:
正如我在上一篇文章中提到的那样,我们在此处看到,您的矩阵维度为(480, 640, 2)。不要在表示帧中特定像素位置的X,Y值和每个像素位置内的DeltaX,DeltaY位移值之间进行混合。

例如,flow[20][20][:]表示位置20 x 20处的像素,它实际上是一个包含2个浮点值的点 - 我们之前谈过的DeltaX,DeltaY
因此,flow[20][20][0]实际上是像素DeltaX的{​​{1}}而20x20是同一像素的flow[20][20][1]DeltaY)。

希望现在很清楚。