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!
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? –
sì, esattamente così. –
tutti gli algoritmi di flusso ottico forniscono l'output in unità pixel? – asdf