2017-04-19 104 views
1

将活动数据(数字)中的数据(数字)提取出来首先,我是编程新手,虽然我想特别学习python。我的动画和CGI背景。使用Python openCV

我在窗口上安装了python 2.7和openCV x64。我测试了他们拥有的光流示例(opt_flow.py)(绿色箭头),但我试图了解如何将数据作为值取出。我对看到相机输出或绿色箭头不感兴趣我只是想稍后使用它的数据。有没有办法做到这一点?例如: :x,y的值和绿色箭头的长度。

谢谢大家

回答

2

可以在opt_flow.pydraw_flow功能得到光流矢量(绿色箭头)。这是我会怎么做:

#!/usr/bin/env python 

''' 
example to show optical flow 

USAGE: opt_flow.py [<video_source>] 

Keys: 
1 - toggle HSV flow visualization 
2 - toggle glitch 

Keys: 
    ESC - exit 
''' 

# Python 2/3 compatibility 
from __future__ import print_function 

import numpy as np 
import math 
import cv2 
import video 


def draw_flow(img, flow, step=16): 
    global arrows 
    h, w = img.shape[:2] 
    y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1).astype(int) 
    fx, fy = flow[y,x].T 
    lines = np.vstack([x, y, x+fx, y+fy]).T.reshape(-1, 2, 2) 
    lines = np.int32(lines + 0.5) 
    vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 
    cv2.polylines(vis, lines, 0, (0, 255, 0)) 
    for (x1, y1), (x2, y2) in lines: 
     arrows.append([x1,y1, math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))]) 
     cv2.circle(vis, (x1, y1), 1, (0, 255, 0), -1) 
    return vis 


def draw_hsv(flow): 
    h, w = flow.shape[:2] 
    fx, fy = flow[:,:,0], flow[:,:,1] 
    ang = np.arctan2(fy, fx) + np.pi 
    v = np.sqrt(fx*fx+fy*fy) 
    hsv = np.zeros((h, w, 3), np.uint8) 
    hsv[...,0] = ang*(180/np.pi/2) 
    hsv[...,1] = 255 
    hsv[...,2] = np.minimum(v*4, 255) 
    bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) 
    return bgr 


def warp_flow(img, flow): 
    h, w = flow.shape[:2] 
    flow = -flow 
    flow[:,:,0] += np.arange(w) 
    flow[:,:,1] += np.arange(h)[:,np.newaxis] 
    res = cv2.remap(img, flow, None, cv2.INTER_LINEAR) 
    return res 

if __name__ == '__main__': 
    import sys 
    print(__doc__) 
    try: 
     fn = sys.argv[1] 
    except IndexError: 
     fn = 0 

    arrows = [] 
    cam = video.create_capture(fn) 
    ret, prev = cam.read() 
    prevgray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY) 
    show_hsv = False 
    show_glitch = False 
    cur_glitch = prev.copy() 

    while True: 
     ret, img = cam.read() 
     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
     flow = cv2.calcOpticalFlowFarneback(prevgray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
     prevgray = gray 

     arrows.clear() 
     finalImg = draw_flow(gray,flow) 
     print(arrows) 
     cv2.imshow('flow', finalImg) 
     if show_hsv: 
      cv2.imshow('flow HSV', draw_hsv(flow)) 
     if show_glitch: 
      cur_glitch = warp_flow(cur_glitch, flow) 
      cv2.imshow('glitch', cur_glitch) 

     ch = cv2.waitKey(5) 
     if ch == 27: 
      break 
     if ch == ord('1'): 
      show_hsv = not show_hsv 
      print('HSV flow visualization is', ['off', 'on'][show_hsv]) 
     if ch == ord('2'): 
      show_glitch = not show_glitch 
      if show_glitch: 
       cur_glitch = img.copy() 
      print('glitch is', ['off', 'on'][show_glitch]) 
    cv2.destroyAllWindows() 

在上面的代码中,我保存的光流矢量(始点坐标和向量长度)在全球变量arrows像这样:

arrows.append([x1,y1, math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))]) 

(x1, y1)箭头的起点和(x2, y2)箭头的终点。

希望它有帮助。

+0

首先,非常感谢你@Elouarn,这就是我想要的。我尝试了python shell,我可以看到所有的数据出来(虽然它很重)。因为我是编程新手,所以我可能会用更多的东西来打扰你。首先:我想要这些值,以便稍后在不同的库(如PyOpenGL)中调用它,问题是如何分别调用每个值? arrow.x1或arrow.length ...等等。 –

+0

要分别访问每个值,可以用'for'循环遍历'arrows'数组。要仅打印'x1',您可以在箭头中使用'for [x1,y1,length]:print(x1)'或'为arrow中的箭头:print(箭头[0])'。希望这是你要求的!如果我的回答对你有帮助,请考虑接受它:) –

+0

谢谢,这又是我正在寻找的。现在我的第二个问题:如果我想在openGL中使用这些值,例如,我会说例如通过箭头[0]组织所有这些对象的X值或者使用箭头[3]的Z值... ...我对吗? (对不起,我是新来的,我刚刚看到了接受的答案部分,我现在这样做了)非常感谢你:) –