什么是OpenCV的密集光流(Farneback)功能的输出?如何在Python中使用它来构建光流图?

Jam*_*ett 8 python opencv motion-detection opticalflow python-2.7

我试图使用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()
Run Code Online (Sandbox Code Playgroud)

这实际上与OpenCv教程中关于密集光流的代码相同.我从print函数收到以下输出:

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]]
Run Code Online (Sandbox Code Playgroud)

我想知道这些值到底是什么?原始的X,Y坐标?最终的X,Y坐标?距离感动了?

我打算尝试使用以下代码中的代码找到初始和最终坐标以制作箭袋图:https: //www.getdatajoy.com/examples/python-plots/vector-fields 这是因为在python中没有我知道的功能,为您绘制光流图.

先感谢您!

A. *_*rid 10

你快到了.让我们先看看它在那里说的calcOpticalFlowFarneback文档:

flow- 计算出的流量图像,其大小prev和类型 相同CV_32FC2.

所以你实际得到的是一个与输入框架大小相同的矩阵.
flow矩阵中的每个元素是表示该像素与帧的位移的点prev.这意味着你得到一个带有x和y值的点(以像素为单位),它给出了最后一帧的delta x和delta y.

  • 好的很棒,谢谢.因此,流矩阵将是与原始图像大小相同的矩阵,并且在某些位置存储在其中的X和Y值将是到达它们当前所在位置的X和Y距离.因此,如果我要找出他们从何处移动,我只需在流矩阵中使用他们当前的像素位置并减去他们行进的X和Y距离? (2认同)