OpenCV 密集光流矩阵

Posted

技术标签:

【中文标题】OpenCV 密集光流矩阵【英文标题】:OpenCV Dense Optical Flow Matrix 【发布时间】:2016-07-04 17:45:57 【问题描述】:

关于 OpenCVs 密集光流函数 (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 我在阅读前 2 帧后使用了一个中断来显示结构数组。

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】:

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

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

例如,flow[20][20][:] 表示位置 20 x 20 的像素,它实际上是一个包含 2 个浮点值的点 - 我们之前讨论过的 DeltaX,DeltaY。 所以,flow[20][20][0] 实际上是像素20x20 处的DeltaXflow[20][20][1] 是同一像素处的DeltaY(20x20)。

希望现在清楚了。

【讨论】:

以上是关于OpenCV 密集光流矩阵的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在opencv c ++中将密集光流转换为稀疏光流?

如何在openCV python中将背景减法与密集光流跟踪相结合

基于 OpenCV C++ 光流的分割代码抛出异常

OpenCV 中的光流颜色图

OpenCV中的光流及视频特征点追踪

Lucas Kanade 密集光流