2016-07-04 103 views
1

我還有一個關於OpenCV密集光流函數(Farneback)的輸出矩陣的問題。 我曾問一個類似的問題,最近OpenCV密集光流矩陣

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值?可能是初始和最終的職位?或者組件是否有虛部?

我已經做了相當多的搜索,但一直沒能找到任何解釋這一點的東西。

回答

0

快速回答:對於每一個像素,你得到兩個XY軸上的位移值。

我覺得你在這裏混合兩種不同的東西:
正如我在你最後的文章中提到,當我們看到這裏,你的矩陣尺寸爲(480, 640, 2)。不要在代表幀中特定像素位置的X,Y值與每個像素位置內的位移值之間進行混合。

例如,flow[20][20][:]代表位置20 x 20上的像素,它實際上是一個有2個浮點值的點 - 我們之前討論過的DeltaX,DeltaY
因此,flow[20][20][0]實際上是DeltaX在像素20x20flow[20][20][1]DeltaY在相同的像素(20x20)。

希望這個現在很清楚。