我有另外一个关于OpenCVs Dense光流功能(Farneback)输出矩阵的问题。 我最近问了一个与此类似的问题
从此我现在知道存储在矩阵中的值是特定像素相对于前一帧移动的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值?可能是初始和最终职位?或者组件是否具有虚构组件?
我已经做了很多搜索,但是找不到任何可以解释这一点的东西。
答案 0 :(得分:4)
快速回答:对于每个像素,您将获得X
和Y
轴上的位移值。
我认为你在这里混合两种不同的东西:
正如我在上一篇文章中提到的那样,我们在此处看到,您的矩阵维度为(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
)。
希望现在很清楚。