python - OpenCV 的密集光流 (Farneback) 函数的输出是什么?这如何用于在 Python 中构建光流图?

标签 python python-2.7 opencv motion-detection opticalflow

我正在尝试使用 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 中,据我所知,没有为您绘制光流图的函数。

提前致谢!

最佳答案

你快到了。我们先来看看calcOpticalFlowFarneback Documentation上面写着:

flow – computed flow image that has the same size as prev and type CV_32FC2.

所以您实际得到的是一个与输入帧大小相同的矩阵。
flow 矩阵中的每个元素都是一个点,表示该像素相对于 prev 帧的位移。这意味着您得到一个具有 x 和 y 值(以像素为单位)的点,它为您提供与上一帧的 delta x 和 delta y。

关于python - OpenCV 的密集光流 (Farneback) 函数的输出是什么?这如何用于在 Python 中构建光流图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38131822/

相关文章:

python - 为什么 pylint 为 numpy.ndarray.shape 返回 `unsubscriptable-object`?

c++ - 调试断言错误 - OpenCV

windows - 将OpenALPR的JSON输出保存到用户定义目录中的文件-Windows 10

Python 和 OpenCV - 霍夫线变换中的主线

python - 如何在 Python 中测试负零?

python - h5py:存储字符串列表

python : Matplotlib Plotting all data in one plot

python - BeautifulSoup4 无法在我的托管服务器上运行

python - 按顺序遍历列表的每个值,从随机值开始

python - 如何在 Python 中没有 API 的情况下从用户名 ID 获取 instagram 用户名?