日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

利用flask将opencv实时视频流输出到浏览器

發(fā)布時間:2025/3/21 HTML 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用flask将opencv实时视频流输出到浏览器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

opencv通過webcam可以獲取本地實(shí)時視頻流,但是如果需要將視頻流共享給其他機(jī)器調(diào)用,就可以將利用flask框架構(gòu)建一個實(shí)時視頻流服務(wù)器,然后其他機(jī)器可以通過向這個服務(wù)器發(fā)送請求來獲取這臺機(jī)器上的實(shí)時視頻流。[這篇文章](https://blog.miguelgrinberg.com/post/video-streaming-with-flask)包含非常詳細(xì)的理論介紹和具體實(shí)現(xiàn),力薦!

首先需要說明的是這里flask提供視頻流是通過generator函數(shù)進(jìn)行的,不了解的可以去查下文檔這里就不具體講了。flask通過將一連串獨(dú)立的jpeg圖片輸出來實(shí)現(xiàn)視頻流,這種方法叫做motion JPEG,好處是延遲很低,但是成像質(zhì)量一般,因為jpeg壓縮圖片的質(zhì)量對motion stream不太夠用。

multipart 模式

想要將后一次請求得到的圖片覆蓋到前一次從而達(dá)到動畫的效果就需要使用在response的時候使用multipart模式。Multipart response由以下幾部分組成:包含multipart content類型的header,分界符號分隔的各個part,每個part都具有特定的content類型。multipart視頻流的結(jié)構(gòu)如下:

HTTP/1.1 200 OK Content-Type: multipart/x-mixed-replace; boundary=frame--frame Content-Type: image/jpeg<jpeg data here> --frame Content-Type: image/jpeg<jpeg data here> ...

flask server

具體實(shí)現(xiàn)代碼:main.py

from flask import Flask, render_template, Response import opencvclass VideoCamera(object):def __init__(self):# 通過opencv獲取實(shí)時視頻流self.video = cv2.VideoCapture(0) def __del__(self):self.video.release()def get_frame(self):success, image = self.video.read()# 因為opencv讀取的圖片并非jpeg格式,因此要用motion JPEG模式需要先將圖片轉(zhuǎn)碼成jpg格式圖片ret, jpeg = cv2.imencode('.jpg', image)return jpeg.tobytes()app = Flask(__name__)@app.route('/') # 主頁 def index():# jinja2模板,具體格式保存在index.html文件中return render_template('index.html')def gen(camera):while True:frame = camera.get_frame()# 使用generator函數(shù)輸出視頻流, 每次請求輸出的content類型是image/jpegyield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')@app.route('/video_feed') # 這個地址返回視頻流響應(yīng) def video_feed():return Response(gen(VideoCamera()),mimetype='multipart/x-mixed-replace; boundary=frame') if __name__ == '__main__':app.run(host='0.0.0.0', debug=True, port=5000)

index.html

<html><head><title>Video Streaming Demonstration</title></head><body><h1>Video Streaming Demonstration</h1><img src="{{ url_for('video_feed') }}"></body> </html>

注:圖片地址由大括號內(nèi)的字典給出,指向app的第二個地址video_feed,在multipart模式下瀏覽器會將每次請求得到的地址對大括號進(jìn)行更新。

局限性

如果視頻流一直存在的話,這個app能輸出視頻流的的客戶端的數(shù)量和web worker的數(shù)量相同,在debug模式下,這個數(shù)量是1,也就是說只有一個瀏覽器上能夠看到視頻流輸出。
如果要克服這種局限的話,使用基于協(xié)同網(wǎng)絡(luò)服務(wù)的框架比如gevent,可以用一個worker線程服務(wù)多個客戶端。

參考

https://blog.miguelgrinberg.com/post/video-streaming-with-flask
https://github.com/mattmakai/video-service-flask
http://www.chioka.in/python-live-video-streaming-example/

轉(zhuǎn)載于:https://www.cnblogs.com/arkenstone/p/7159615.html

總結(jié)

以上是生活随笔為你收集整理的利用flask将opencv实时视频流输出到浏览器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。