2016-06-30 11 views
5

Sto cercando di utilizzare l'uscita della funzione di flusso ottico denso di Opencv per tracciare un grafico di quiver dei vettori di movimento ma non sono stato in grado di trovare ciò che la funzione effettivamente emette. Ecco il codice:Cosa viene emesso dalla funzione di flusso ottico denso (Farneback) di OpenCV? Come può essere usato per costruire una mappa del flusso ottico in Python?

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() 

Questo è effettivamente lo stesso codice fornito nel tutorial OpenCv sul flusso ottico denso. Ricevo il seguente risultato dalla funzione di stampa:

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]] 

Mi piacerebbe sapere quali sono esattamente questi valori? Coordinate X, Y originali? Finali X, coordinate Y? Distanza spostata?

Ho intenzione di provare e trovare le coordinate iniziali e finali per fare un complotto faretra utilizzando il codice dalla seguente pagina: https://www.getdatajoy.com/examples/python-plots/vector-fields Questo perché in Python non c'è alcuna funzione di essere a conoscenza di che traccia una mappa flusso ottico per te.

Grazie in anticipo!

risposta

5

Eri quasi arrivato. Lascia prima dare un'occhiata al calcOpticalFlowFarneback Documentation si dice che c'è:

flow - immagine del flusso calcolato che ha la stessa dimensione e tipo prev CV_32FC2.

Quindi, ciò che si ottiene è una matrice che ha le stesse dimensioni del frame di input.
Ogni elemento in quella matrice flow è un punto che rappresenta lo spostamento di tale pixel dal frame prev. Significa che ottieni un punto con valori xey (in unità pixel) che ti danno il delta x e il delta y dall'ultimo fotogramma.

+1

Ok, fantastico, grazie. Quindi la matrice di flusso sarebbe una matrice della stessa dimensione dell'immagine originale, e i valori X e Y memorizzati in essa in determinate posizioni sarebbero la distanza X e Y percorsa per arrivare dove sono attualmente. Quindi, se dovessi scoprire da dove sono stati spostati, userò semplicemente la loro posizione attuale dei pixel nella matrice di flusso e sottrai le distanze X e Y che hanno percorso? –

+0

sì, esattamente così. –

+0

tutti gli algoritmi di flusso ottico forniscono l'output in unità pixel? – asdf

Problemi correlati