福野泰介の一日一創 - create every day

人気のプログラミング言語、Pythonを使ったリアルタイム画像処理と思って、Macのカメラを読み込み、とりあえず画面に表示するだけプログラムをつくるも、フレームレートが著しく悪い。カクカクして、これでは興ざめ。

import cv2 cap = cv2.VideoCapture(0) print("fps: " + str(cap.get(cv2.CAP_PROP_FPS))) while True: ret, frame = cap.read() frame = cv2.flip(frame, 1) # horizontal flip cv2.imshow("esc key to close", frame) k = cv2.waitKey(1) if k == 27: break cap.release() cv2.destroyAllWindows()

Djangoより、シンプルなwebアプリフレームワーク Flask を使って、ブラウザで表示するととっても滑らかになりました!

左右反転させるだけのただの鏡アプリです。
画像認識してネコ耳を上書きしたり、背景を消したり、いろいろ遊ぶテンプレートとして活用ください。

import cv2 from flask import Flask, Response app = Flask(__name__) webcamid = 0 cap = cv2.VideoCapture(webcamid) print("fps: " + str(cap.get(cv2.CAP_PROP_FPS))) def getFrames(): while True: ret, frame = cap.read() frame = cv2.flip(frame, 1) # horizontal flip ret, jpg = cv2.imencode("test.jpg", frame) yield b'--boundary\r\nContent-Type: image/jpeg\r\n\r\n' + jpg.tostring() + b'\r\n\r\n' @app.route('/') def video_feed(): return Response(getFrames(), mimetype='multipart/x-mixed-replace; boundary=boundary') import webbrowser webbrowser.get().open("http://localhost:5001/") app.run(host = '0.0.0.0', port = 5001, threaded = False) # only 1 client

ブラウザを開くコードもついているので、Python3で動かすと、ブラウザが開いてすぐに表示が始まります。
Content-Type: multipart/x-mixed-replace は、初めて使いましたが、なかなか豪快なプロトコルでおもしろい!
複数開いて問題が置きないように、Flashの設定で threaded = False として、シングルスレッド処理としています。

スレッドモデルなプログラミング言語 Python の yield がポイントです。

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像