2016-06-30 4 views
5

Я пытаюсь использовать вывод функции оптического потока 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 нет никакой функции, что я отдаю себе отчет в том, что участки Карта оптического потока для тебя.

Заранее благодарю вас!

ответ

5

Вы были почти там. Давайте сначала посмотрим на calcOpticalFlowFarneback Documentation он говорит, что:

flow - вычислен изображение потока, который имеет такой же размер, как и prev типа CV_32FC2.

Итак, вы фактически получаете матрицу, которая имеет тот же размер, что и ваш входной кадр.
Каждый элемент в этой матрице flow представляет собой точку, которая представляет собой смещение этого пикселя из кадра prev. Это означает, что вы получаете точку с значениями x и y (в единицах пикселей), которая дает вам дельта x и дельта y из последнего кадра.

+1

Хорошо, спасибо. Таким образом, матрица расхода будет представлять собой матрицу такого же размера, что и исходное изображение, а значения X и Y, сохраненные в ней в определенных положениях, будут расстоянием X и Y, пройденным, чтобы добраться туда, где они находятся в настоящее время. Поэтому, если бы я выяснил, куда они перешли, я просто использовал бы их текущее местоположение пикселей в матрице потока и вычитал пройденные им расстояния X и Y? –

+0

да, точно так же. –

+0

все ли алгоритмы оптического потока дают выход в пиксельных единицах? – asdf