2017-04-19 100 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值... ...我對嗎? (對不起,我是新來的,我剛剛看到了接受的答案部分,我現在這樣做了)非常感謝你:) –