2016-06-30 21 views
5

Ich versuche, die Ausgabe von Opencvs dichter optischer Flussfunktion zu verwenden, um ein Köcherdiagramm der Bewegungsvektoren zu zeichnen, konnte aber nicht herausfinden, was die Funktion tatsächlich ausgibt. Hier ist der Code:Was wird von der OpenCV-Funktion für dichten optischen Fluss (Farneback) ausgegeben? Wie kann dies verwendet werden, um eine optische Flusskarte in Python zu erstellen?

import cv2 
import numpy as np 

cap = cv2.VideoCapture('GOPR1745.avi') 

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

hsv[...,1] = 255 
count=0 

while(1): 
    ret, frame2 = cap.read() 
    next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY) 
    flow = cv2.calcOpticalFlowFarneback(prvs,next,None, 0.5, 3, 15, 3, 10, 1.2, 0) 
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) 

    hsv[...,0] = ang*180/np.pi/2 
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) 
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) 
    if count==10: 
     count=0 

     print "flow",flow 

    cv2.imshow('frame2',rgb) 
    count=count+1 
    k = cv2.waitKey(30) & 0xff 
    if k == 27: 
     break 
    elif k == ord('s'): 
    prvs = next 

cap.release() 
cv2.destroyAllWindows() 

Dies ist effektiv der gleiche Code wie in den OpenCV-Tutorial auf dichten optischen Fluss gegeben. Ich erhalte folgende Ausgabe von der Druckfunktion:

flow [[[ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    ..., 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00]] 

..., 
[[ -3.54891084e-14 -1.38642463e-14] 
    [ -2.58058853e-14 -1.54020863e-14] 
    [ -5.56561768e-14 -1.88019359e-14] 
    ..., 
    [ -7.59403916e-15 1.16633225e-13] 
    [ 7.22156371e-14 -1.61951507e-13] 
    [ -4.30715618e-15 -4.39530987e-14]] 

[[ -3.54891084e-14 -1.38642463e-14] 
    [ -2.58058853e-14 -1.54020863e-14] 
    [ -5.56561768e-14 -1.88019359e-14] 
    ..., 
    [ -7.59403916e-15 1.16633225e-13] 
    [ 7.22156371e-14 -1.61951507e-13] 
    [ -4.30715618e-15 -4.39530987e-14]] 

Ich würde gerne wissen, was genau diese Werte sind? Original X, Y Koordinaten? Letzte X, Y Koordinaten? Entfernung verschoben?

Ich plane, die Anfangs- und Endkoordinaten, um zu versuchen und finden Sie einen Köcher Stück unter Verwendung von Code aus der folgenden Seite zu machen: https://www.getdatajoy.com/examples/python-plots/vector-fields Dies liegt daran, in Python gibt es keine Funktion ist, dass mir bewusst bin, dass eine optische Strömungs Karte Plots für dich.

Vielen Dank im Voraus!

Antwort

5

Sie waren fast da. Läßt zuerst am calcOpticalFlowFarneback Documentation einen Blick sagt es dort:

flow - berechnet Flussbild, das die gleiche Größe wie prev und Typ CV_32FC2 hat.

Also was Sie eigentlich bekommen, ist eine Matrix, die die gleiche Größe wie Ihr Eingabe-Frame hat.
Jedes Element in dieser flow Matrix ist ein Punkt, der die Verschiebung dieses Pixels aus dem prev Frame darstellt. Das bedeutet, dass Sie einen Punkt mit x- und y-Werten (in Pixeleinheiten) erhalten, der Ihnen das Delta x und das Delta y vom letzten Frame gibt.

+1

Okay, super, danke. Die Flussmatrix wäre also eine Matrix, die die gleiche Größe wie das Originalbild hat, und die X- und Y-Werte, die in bestimmten Positionen gespeichert sind, würden die X- und Y-Entfernung sein, um dorthin zu gelangen, wo sie sich gerade befinden. Wenn ich also herausfinden würde, wo sie sich bewegt haben, würde ich einfach ihre aktuelle Pixelposition in der Flussmatrix verwenden und die X- und Y-Abstände, die sie zurückgelegt haben, subtrahieren. –

+0

ja, genau so. –

+0

geben alle optischen Flussalgorithmen Ausgabe in Pixeleinheiten? – asdf