前提・実現したいこと
現在以下の環境にてWebアプリケーションを開発しています。
・OS:Ubuntu18.04
・使用言語:JavaScript、HTML、Python3.6.9
・フレームワーク等:Flask、OpenCV、Flask-SocketIO
本Webアプリは以下の機能を持ちます。
- Flaskにて、OpenCVでIPカメラから映像をリアルタイムに取得
- リアルタイム映像からフレームを取得し、AIモジュールにより解析し、画像を加工
- 加工された画像を随時HTML上に表示(以下、リアルタイム表示機能)
- 2で解析した結果、表示したいフレームを同じ画面の別タグ内に表示(以下、任意画像表示機能)
試したことその1〜リアルタイム映像取得、画像加工、表示方法〜
IPカメラから取得した映像の解析とリアルタイム表示機能は以下のサイトを参考に実現できそうです。
参考にしたサイト
上記サイトを参考に作成したプログラム
作成したプログラムでは使用する映像をself.video = cv2.VideoCapture("mov_hts-samp009.mp4")
で指定しています。
ここを適切に変更することで、IPカメラ映像のリアルタイム取得が可能です。
また、yield
でフレームを返している部分の直前に画像を加工する記述を加えることで、
IPカメラから取得した映像に加工を加えた映像をリアルタイム表示することが可能になると考えています。
試したことその2〜解析の結果表示したい画像を表示する方法〜
いくつかのサイトをググった結果、ソケット通信を用いることで任意画像表示機能を実現できることがわかりました。
作成したプログラム
このサンプルでは、取得した映像を50フレームごとに表示しています。
この部分を50フレームごとではなく、任意の条件式を満たすときに表示するよう変更することで、
任意のタイミングで、フレーム画像を表示することが可能になると考えています。
試したことその3〜その1とその2の組み合わせ〜
リアルタイム表示機能をyield
により実現し、任意画像表示機能をsocket通信により実現しようとしました。
こちらが作成したプログラムです
実行した結果、以下のようなエラーが発生します。
二重にリクエストを飛ばすなと。flaskのルートを指定した関数実行中にソケットのemitをするなという意味でしょうか。
This typically means that you attempted to use functionality that needed an active HTTP request. Consult the documentation on testing for information about how to avoid this problem.
試したこと4〜毎フレームSocket通信する〜
「試したことその2」で作成したプログラムを変更し、リアルタイム表示機能もSocket通信により実現しようとしました。
例えば/sample2/app.py
を以下のように修正すればできるのではと考えました。
しかし、実際にやってみるとめちゃくちゃ重たくて使い物になりません。
----------略---------- 25 camera = Camera() 26 count = 0 27 while True: 28 frame = camera.get_frame() 29 count += 1 30 31 32 if frame is not None: 33 emit('capture-send', { 'dataURL': prefix+base64.b64encode(frame).decode('utf-8')}) # 追加 34 # if count % 20 == 0: # 削除 35 # emit('capture-send', { 'dataURL': prefix+base64.b64encode(frame).decode('utf-8')}) # 削除 36 else: 37 break ----------略----------
お伺いしたいこと
以下のような解決手段をご教授いただけないでしょうか。
- 「試したこと3」のエラーを回避する方法
- 「試したこと4」の処理を軽くし、毎フレームSocket通信で実現する方法
- 別の方法で目的のアプリケーションを実現する技術(フレームワーク等)
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/15 00:47