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 がポイントです。