Что выводится из функции плотного оптического потока (Farneback) в OpenCV? Как это можно использовать для построения оптической карты потока в Python?

Я пытаюсь использовать вывод функции плотного оптического потока Opencv, чтобы нарисовать колчанный график векторов движения, но не смог найти то, что на самом деле выводит функция. Вот код:

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

Заранее спасибо!

Ответы на вопрос(1)

Решение Вопроса

Вы были почти там. Давайте сначала посмотрим наcalcOpticalFlowFarneback Документация там сказано:

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

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

 A. Sarid01 июл. 2016 г., 10:24
да, именно так
 asdf24 февр. 2018 г., 10:57
все алгоритмы оптического потока дают вывод в пиксельных единицах?
 James Mallett01 июл. 2016 г., 09:35
Хорошо, классно, спасибо. Таким образом, матрица потока будет представлять собой матрицу того же размера, что и исходное изображение, а значения X и Y, сохраненные в нем в определенных положениях, будут расстоянием X и Y, пройденным для достижения того места, где они находятся в данный момент. Так что, если бы я узнал, откуда они переместились, я бы просто использовал их текущее положение в пикселях в матрице потока и вычел бы пройденные ими расстояния X и Y?

Ваш ответ на вопрос