opencv通过webcam可以获取本地实时视频流,但是如果需要将视频流共享给其他机器调用,就可以将利用flask框架构建一个实时视频流服务器,然后其他机器可以通过向这个服务器发送请求来获取这台机器上的实时视频流。[这篇文章](https://blog.miguelgrinberg.com/post/video-streaming-with-flask)包含非常详细的理论介绍和具体实现,力荐!

首先需要说明的是这里flask提供视频流是通过generator函数进行的,不了解的可以去查下文档这里就不具体讲了。flask通过将一连串独立的jpeg图片输出来实现视频流,这种方法叫做motion JPEG,好处是延迟很低,但是成像质量一般,因为jpeg压缩图片的质量对motion stream不太够用。

multipart 模式

想要将后一次请求得到的图片覆盖到前一次从而达到动画的效果就需要使用在response的时候使用multipart模式。Multipart response由以下几部分组成:包含multipart content类型的header,分界符号分隔的各个part,每个part都具有特定的content类型。multipart视频流的结构如下:

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

具体实现代码main.py

from flask import Flask, render_template, Response
import opencvclass VideoCamera(object):def __init__(self):# 通过opencv获取实时视频流self.video = cv2.VideoCapture(0) def __del__(self):self.video.release()def get_frame(self):success, image = self.video.read()# 因为opencv读取的图片并非jpeg格式,因此要用motion JPEG模式需要先将图片转码成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函数输出视频流, 每次请求输出的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')  # 这个地址返回视频流响应
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>

注:图片地址由大括号内的字典给出,指向app的第二个地址video_feed,在multipart模式下浏览器会将每次请求得到的地址对大括号进行更新。

局限性

如果视频流一直存在的话,这个app能输出视频流的的客户端的数量和web worker的数量相同,在debug模式下,这个数量是1,也就是说只有一个浏览器上能够看到视频流输出。
如果要克服这种局限的话,使用基于协同网络服务的框架比如gevent,可以用一个worker线程服务多个客户端。

参考

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/

转载于:https://www.cnblogs.com/arkenstone/p/7159615.html

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

  1. flask+python 实时视频流输出到前台

    flask+python 实时视频流输出到前台 二.问题描述: 1.调用摄像头获取视频流 2.将视频流处理并传递给浏览器 3.不是录制后处理,而是边录制边处理,边传递 4. flash后台进行处理,而 ...

  2. python实现流媒体传输_基于OpenCV的网络实时视频流传输的实现

    很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头.但是有时,大家又希望能够随时随地观看视频直播. 大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它 ...

  3. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  4. 基于 OpenCV 的网络实时视频流传输

    作者 | 努比 来源 | 小白学视觉 大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它们具有更高的分辨率并降低了布线成本.在本文中,我们将重点介绍IP摄像机 ...

  5. 基于OpenCV的网络实时视频流传输

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头.但是有 ...

  6. Web接收实时视频流并显示(flask创建路由接收)| 解决延时不同步问题

    在开发B/S架构的检测算法时,需要对摄像头实时视频流进行检测处理. 下文代码能实现接收实时视频流到web端指定路由下进行播放.在后续开发中可继续将该路由视频流引入到相应的前端Html文件中的img指定 ...

  7. 【树莓派4B深度学习 垃圾分类】Chap.3 树莓派安装opencv并测试视频接口实时视频流的垃圾分类【深度学习 招式篇】

    [树莓派4B深度学习 垃圾分类]Chap.3 树莓派安装opencv并测试视频接口实时视频流的垃圾分类[深度学习 招式篇] 后记 1.激活虚拟环境+进入代码+更改测试集路径(这里是安装成功后测试的代码 ...

  8. 利用flask解析海康摄像头视频

    利用flask解析海康摄像头视频 利用flask解析海康摄像头和大华摄像头的视频 一.安装依赖包 二.获取海康摄像头视频流 三.将视频流输出到Web页面 四. 创建HTML模板文件 利用flask解析 ...

  9. JAVA 利用FFmpegFrame 获取rstp监控视频流截图

    JAVA 利用FFmpegFrameGrabber 获取rstp监控视频流截图工具 最近在项目内碰见一个需求,需要通过监控视频连接获取视频流截取流内的图片并保存的功能,在网上找了各种方案费了些时间,写 ...

最新文章

  1. C++项目中的extern C {}
  2. 找到所有数组中消失的数字—leetcode448
  3. MySQL逻辑物理备份测试
  4. 光伏发电对系统冲击大 “十三五”电力规划重点增强调峰能力
  5. 远程桌面无法找到计算机不属于指定网络,远程桌面找不到计算机
  6. list, tuple, dict, set的用法总结
  7. 配置库管理及版本管理规范
  8. 基于Python的房价影响因素分析
  9. linux下解压iso文件
  10. Tomcat的appBase,docBase,path关系
  11. 网络篇 OSPF的DR与BDR的选举-48
  12. 完美世界手游服务器维护中,完美世界手游黑屏闪退解决办法 玩不了怎么办
  13. python webpy启动服务
  14. 利用java计算长方形的面积
  15. (详细)《美国节日》:某月的第几个星期几
  16. 中外三大院士领衔:​INSEC WORLD世界信息安全大会即将开幕
  17. tkinter可视化天气查询
  18. Unity与Processing的画面传输(Spout 接收与发送)
  19. 二十四、红孩儿亲爹的考证
  20. 配置Maven从Nexus下载构件

热门文章

  1. linux图形图像三剑客,就linux三剑客简单归纳
  2. DVWA 不跳转_渗透测试入门-DVWA应用渗透软件安装与使用
  3. 将Web项目部署到华为云服务器的Linux的Tomcat中
  4. 在python下实现ssh出现错误:ModuleNotFoundError: No module named ‘cryptography‘
  5. java adt mac_Mac下搭建Eclipse Android开发环境
  6. 瓦力机器人故障维修_大眼萌!5G巡逻机器人亮相乌镇,24小时值守互联网大会...
  7. 开机后台运行jupyter_手机重启=关机再开机?原来差别竟这么大,很多人都不知道!...
  8. 2.分布式文件系统HDFS之一
  9. 14.文件系统:高大上的东西——import关键字/模块
  10. 【c++】23.【函数指针】定义? 为什么不直接调用函数而要使用函数指针?