Я пытаюсь использовать вывод функции оптического потока Opencv для рисования кривой колчана векторов движения, но не смог найти то, что функция фактически выводит. Вот код:Что выводится из функции плотного оптического потока OpenCV (Farneback)? Как это можно использовать для построения карты оптического потока в 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()
Это фактически тот же код, как указано в учебнике OpenCV на плотном оптическом потоке. Я получаю следующий результат от функции печати:
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]]
Я хотел бы знать, что именно эти значения? Оригинальные координаты X, Y? Конечные координаты X, Y? Расстояние перемещено?
Я планирую, чтобы попытаться найти начальные и конечные координаты, чтобы сделать колчан участок с помощью кода из следующей страницы: https://www.getdatajoy.com/examples/python-plots/vector-fields Это происходит потому, что в Python нет никакой функции, что я отдаю себе отчет в том, что участки Карта оптического потока для тебя.
Заранее благодарю вас!
Хорошо, спасибо. Таким образом, матрица расхода будет представлять собой матрицу такого же размера, что и исходное изображение, а значения X и Y, сохраненные в ней в определенных положениях, будут расстоянием X и Y, пройденным, чтобы добраться туда, где они находятся в настоящее время. Поэтому, если бы я выяснил, куда они перешли, я просто использовал бы их текущее местоположение пикселей в матрице потока и вычитал пройденные им расстояния X и Y? –
да, точно так же. –
все ли алгоритмы оптического потока дают выход в пиксельных единицах? – asdf