伸缩自如的Flask [day 25] Flask with web cam

github:
https://github.com/wilsonsujames/webcam/tree/master/stream-video-browser

参考攻略:
https://blog.miguelgrinberg.com/post/video-streaming-with-flask

在介绍网路摄影机之前,可以先看一下python的生成器:

def yield_fun():
    a = 1
    b = 2
    yield a
    yield b

print(yield_fun())

generator = yield_fun()
print(next(generator))
print(next(generator))

可以发现yield_fun()为一个生成器物件,在每一个next(generator)中,产生该生成器中下一步的值。

可以在参考更详尽的说明:

https://blog.csdn.net/mieleizhi0522/article/details/82142856

再来可以看程序的部分:

<html>
  <head>
    <title>Pi Video Surveillance</title>
  </head>
  <body>
    <h1>Pi Video Surveillance</h1>
    <img style="width: 800px;height: 800px;" src="{{ url_for('video_feed') }}">
  </body>
</html>

可以发现图片img,由flask中video_feed function来提供。

在camera.py 的部分:

from cv2 import cv2 as cv2 

class VideoCamera(object):
    def __init__(self):
        #由opencv来获取预设为0 装置影像
        self.video = cv2.VideoCapture(0)

    def __del__(self):
        self.video.release()        

    def get_frame(self):
        ret, frame = self.video.read()

        ret, jpeg = cv2.imencode('.jpg', frame)

        return jpeg.tobytes()

由get_frame来获取每一帪的影像。

主程序webcam.py:

from flask import Flask, render_template, Response, jsonify
from camera import VideoCamera
from cv2 import cv2 as cv2 

app = Flask(__name__)

video_stream = VideoCamera()


def gen(camera):
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
        

@app.route('/')
def index():
    
    return render_template('index.html')


@app.route('/video_feed')
def video_feed():
    print(type(gen(video_stream)))
    print(gen(video_stream))
    

    return Response(gen(video_stream),
                mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='127.0.0.1', debug=True,port="5000")

利用gen这个生成器来将每一帪的图片产出,并且设定好header为串流的资讯。

影片版本:


<<:  Day 10 (Bootstrap)

>>:  #新手 询问错误原因

全通路发展个人品牌-笔记

出处来自FB畅哥-全通路个人品牌 主讲者:「空姐报报」版主 Emily 为何卸下空姐的身分? 讲者是...

Uniform - shader 之参数

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

为什麽 CQRS - Why CQRS

为什麽 CQRS - Why CQRS CQRS (Command Query Responsibi...

所以什麽是MQTT啊?

前言 在某次跟同事的讨论中听到这个名词,"A:你知道mqtt吗? W:痾 我不知道 A:...

DAY15 - 最小生成树

今天写最小生成树~~ 会提到的相关内容: BFS 堆结构 并查集 贪心 直接放个例题来说明 例题&a...