2017-11-30 41 views
1

こんにちは、私はholoviewsを使い始めました。そして、私はholoviews、opencvを使って小さなストリーミングビデオアプリケーションを準備しようとしています。私は竜巻と非同期プログラミングの経験が非常に限られています。holoviewsとtornado pythonを使ってストリーミングプロットを作成する方法

from holoviews.streams import Pipe, Buffer 
from tornado.ioloop import IOLoop 
from tornado import gen 
import cv2 
@gen.coroutine 
def f(): 
    pipe = Pipe(data=[]) 
    #print(pipe) 
    vd = cv2.VideoCapture("TestVideo.mp4") 
    width = int(vd.get(cv2.CAP_PROP_FRAME_WIDTH)) 
    height = int(vd.get(cv2.CAP_PROP_FRAME_HEIGHT)) 
    frames = int(vd.get(cv2.CAP_PROP_FRAME_COUNT)) 
    print("Hello") 
    for i in range(frames): 
     ret, frame = vd.read() 
     #print(i) 
     try: 
      rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
      gen.sleep(10000000000) 
      pipe.send(rgb[:]) 
      #print(str(i)+'x') 
     except: 
      #print(str(i)+'Error') 
      print("Error at Frame:"+str(i)) 
      pass 
    vd.release() 
    cv2.destroyAllWindows() 

IOLoop.current().add_callback(f) 
hv.DynamicMap(hv.RGB, streams=[pipe]) 

実行中/ストリーミングアップデートが取得できません。私はちょうど最後のフレームで単一のイメージを取得します。誰かがここで私の間違いを理解するのを助けることができます

+0

待つだけ、あなたが317年後に次のフレームを取得します、心配しないでください。ジョークを除いて、 'gen.sleep'は時間を秒単位でとります。 「10000000000秒」は「317年」以上です。 – xyres

+0

ハハ、そして私は最後のフレームで終わります。驚くべきことに、とにかくそれがミリ秒/マイクロ秒ではないことを知っていて良かった。ありがとう – Rahuketu86

答えて

0

あなたは私がstreamzのPythonライブラリを使用して実行可能なものを持って最終的に

を@philippjfrありがとうございました。しかし、このアプローチは有効です。これは上記のアプローチに基づいた私の実践的な解決策です。

`` `

import numpy as np 
import pandas as pd 
import holoviews as hv 
hv.extension('bokeh', 'matplotlib') 
from holoviews.streams import Pipe, Buffer 
from tornado.ioloop import IOLoop 
from tornado import gen 
import cv2 

@gen.coroutine 
def f(): 
    width = int(vd.get(cv2.CAP_PROP_FRAME_WIDTH)) 
    height = int(vd.get(cv2.CAP_PROP_FRAME_HEIGHT)) 
    frames = int(vd.get(cv2.CAP_PROP_FRAME_COUNT)) 
    while frames > 0: 
     ret, frame = vd.read() 
     rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
     frames -= 1 
     yield pipe.send(rgb) 
    vd.release() 
    cv2.destroyAllWindows() 

vd = cv2.VideoCapture("TestVideo.mp4")  
ret, frame0 = vd.read() 
rgb = cv2.cvtColor(frame0, cv2.COLOR_BGR2RGBA) 
pipe = Pipe(data=rgb) 
#pipe = Pipe(data=[]) 
IOLoop.current().add_callback(f) 
hv.DynamicMap(hv.RGB, streams=[pipe]) 

` ``

1

gen.sleepについてのコメントとは別に、秒単位で時間をとっていますが、あなたはコールバックをジェネレータとして書く必要があります。このような何かにそれを行う必要があります。

from holoviews.streams import Pipe, Buffer 
from tornado.ioloop import IOLoop 
from tornado import gen 
import cv2 

@gen.coroutine 
def f(): 
    vd = cv2.VideoCapture("TestVideo.mp4") 
    width = int(vd.get(cv2.CAP_PROP_FRAME_WIDTH)) 
    height = int(vd.get(cv2.CAP_PROP_FRAME_HEIGHT)) 
    frames = int(vd.get(cv2.CAP_PROP_FRAME_COUNT)) 
    while frames > 0: 
     ret, frame = vd.read() 
     rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
     pipe.send(rgb) 
     frames -= 1 
     yield gen.sleep(1) 
    vd.release() 
    cv2.destroyAllWindows() 

pipe = Pipe(data=[]) 
IOLoop.current().add_callback(f) 
hv.DynamicMap(hv.RGB, streams=[pipe]) 
関連する問題