2017-04-19 25 views
1

を使用してライブフィード(ウェブカメラ)からデータ(数値)としてオプティカルフローを抽出します。特にPythonを学びたいと思いますが、プログラミングには初めてです。アニメーションとCGIの私の背景。Python openCV

私はpython 2.7とopenCV x64をWindowsにインストールしています。私はオプティカルフローの例(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シェルを試しました。私はプログラミングには新しいので、いくつかのことをもっと気にするかもしれません。まず、これらの値をPyOpenGLなどの別のライブラリで呼び出せるようにしたいのですが、それぞれの値を別々に呼び出す方法が問題です。 arrow.x1またはarrow.length ...などです。 –

+0

各値に別々にアクセスするには、 'for'ループを使って' arrows'配列を繰り返し処理することができます。 'x1'だけを出力するには' for [x1、y1、length] for arrow:print(x1) 'や' for arrow of arrow:print(arrow [0]) 'などのようにすることができます。あなたが求めていたことを願っていますように!私の答えがあなたを助けたら、それを受け入れることを検討してください:) –

+0

ありがとう、これは私が探しているものです。今私の2番目の質問:たとえば、openGLでこれらの値を使用する場合は、たとえば、これらのオブジェクトXの値を 'arrow [0]'で整理するか、 'arrow [3]'のZ値を使用するといいでしょう... Am私は正しい? (申し訳ありません、私はここに新しいです、私は受け入れる答えの部分を見ました、私は今でした)とてもありがとうございます:) –