基于OpenCv+Django的网络实时视频流传输(前后端分离)

人工智能评论14

秋风阁——北溪入江流:https://focus-wind.com/
秋风阁——基于OpenCv+Django的网络实时视频流传输(前后端分离)
使用OpenCv捕获摄像机画面后,我们有时候需要将画面显示在界面上。本博客基于Django的前后端分离模式,将视频流从后端读取,传送给前端显示。

Django流传输实例:StreamingHttpResponse

在使用Django进行视频流传输时,无法使用HttpResponse,JsonResponse等对象对内容直接传输,需要使用StreamingHttpResponse流式传输一个响应给浏览器。StreamingHttpResponse不是HttpResponse的子类,因此他们之间的API略有不同。StreamingHttpResponse与HttpResponse之间有以下显著区别:

  • 应该给StreamingHttpResponse一个迭代器,产生字节字符串作为内容。
  • 不应该直接访问StreamingHttpResponse的内容,除非通过迭代器响应对象本身。
  • StreamingHttpResponse没有content属性。相反,他有一个streaming_content属性。
  • 无法使用类文件对象的tell()何write()方法。这样会引起一个异常。

Django传输视频流

因为使用Django的StreamingHttpResponse类进行流传输,所以我们首先需要生成一个视频流的迭代器,在迭代器中,需要将从opencv中获取到的numpy.ndarray三维数组转换为字节类型的,然后传输到前端。

传输视频流:

  1. 读取图片
  2. 图片压缩(针对分辨率较高的界面)
  3. 对图片进行解码
  4. 转换为byte类型
  5. 传输视频流
import cv2
from django.http import StreamingHttpResponse

def gen_display(camera):
"""
    视频流生成器功能。
"""
    while True:

        ret, frame = camera.read()
        if ret:

            ret, frame = cv2.imencode('.jpeg', frame)
            if ret:

                yield (b'--frame\r\n'
                       b'Content-Type: image/jpeg\r\n\r\n' + frame.tobytes() + b'\r\n')

def video(request):
"""
    视频流路由。将其放入img标记的src属性中。
    例如:
"""

    camera = cv2.VideoCapture(0)

    return StreamingHttpResponse(gen_display(camera), content_type='multipart/x-mixed-replace; boundary=frame')

在使用海康威视等分辨率较高的相机时,直接解码,延迟过高,所以需要先对图片进行压缩,然后解码。

经测试,海康相机使用0.25的压缩倍率显示压缩效率较好,当大于0.25时,延迟较高,小于0.25时,界面显示较差

迭代器优化:

def gen_display(camera):
"""
    视频流生成器功能。
"""
    while True:

        ret, frame = camera.read()
        if ret:
            frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

            ret, frame = cv2.imencode('.jpeg', frame)
            if ret:

                yield (b'--frame\r\n'
                       b'Content-Type: image/jpeg\r\n\r\n' + frame.tobytes() + b'\r\n')

前端显示视频流

在Django中配置路由后,在浏览器端直接访问视频url即可看到视频显示画面。
在前端HTML5中,将视频路由写入img标签的src属性中,即可访问视频流界面。例如:基于OpenCv+Django的网络实时视频流传输(前后端分离) 前端显示视频流:

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>基于OpenCv+Django的网络实时视频流传输(前后端分离)title>
head>
<body>

    <img src="http://127.0.0.1:8000/api/cv/display">
body>
html>

显示结果:
基于OpenCv+Django的网络实时视频流传输(前后端分离)

在前端显示视频流中,可以通过调整img标签的属性来调整界面显示位置,显示大小。所以在进行视频流前后端传输中,在保证视频显示清晰度的情况下,建议使用前端来调整界面大小。

调整界面前端显示视频样式:

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>基于OpenCv+Django的网络实时视频流传输(前后端分离)title>
    <style>
        #video {
            width: 500px;
            height: 500px;
        }
    style>
head>
<body>

    <div align="center"><img src="http://127.0.0.1:8000/api/cv/display" id="video">div>
body>
html>

显示结果:

基于OpenCv+Django的网络实时视频流传输(前后端分离)

视频流传输优化

在项目中,我们可能经常需要对多个相机进行处理,而不是对一个相机进行操作,所以我们可以使用相机工厂来获取相机。在实例化相机后,需要开启一个线程,及时更新缓存队列,确保OpenCv不会因为缓存过多而造成缓存区堵塞,界面延迟。

  • 使用线程实时读取OpenCv的内容到队列中
  • 使用相机工厂来获取相机

在示例代码中,camera_model为自定义model,其中代码需要用到的数据有数据表记录的唯一标识id,相机的访问api:camera_api

相机类:

import queue
import threading

import cv2

from apps.device.models import Camera

class CameraException(Exception):
    message = None

    def __init__(self, message: str):

        self.message = message

    def __str__(self):
        return self.message

class BaseCamera:

    cam = None

    queue_image = queue.Queue(maxsize=10)

    thread = None

    camera_model = None

    def __init__(self, camera_model: Camera):
"""
        使用rtsp流初始化相机参数
        rtsp格式:rtsp://[username]:
		
输入密码查看隐藏内容

@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream username: 用户名。例如admin。 password: 密码。例如12345。 ip: 为设备IP。例如 192.0.0.64。 port: 端口号默认为554,若为默认可不填写。 codec:有h264、MPEG-4、mpeg4这几种。 channel: 通道号,起始为1。例如通道1,则为ch1。 subtype: 码流类型,主码流为main,辅码流为sub。 """ self.cam = cv2.VideoCapture(camera_model.camera_api) if self.cam.isOpened(): self.thread = threading.Thread(target=self._thread, daemon=True) self.thread.start() else: raise CameraException("视频流接口访问失败") def _thread(self): """ 相机后台进程,持续读取相机 opencv读取时会将信息存储到缓存区里,处理速度小于缓存区速度,会导致资源积累 """ while self.cam.isOpened(): ret, img = self.cam.read() if not ret or img is None: pass else: if self.queue_image.full(): self.queue_image.get() self.queue_image.put(img) else: self.queue_image.put(img) def read(self): """ 直接读取从rtsp流中获取到的图片,不进行额外加工 可能为空,需做判空处理 """ return self.queue_image.get() def get_frame(self): """ 获取加工后的图片,可以直接返回给前端显示 """ img = self.queue_image.get() if img is None: return None else: img = cv2.resize(img, (0, 0), fx=0.25, fy=0.25) ret, jpeg = cv2.imencode('.jpeg', img) return jpeg.tobytes() class CameraFactory: """ 相机工厂 """ cameras = {} @classmethod def get_camera(cls, camera_id: int): camera = cls.cameras.get(camera_id) if camera is None: try: camera_model = Camera.objects.get(id=camera_id) base_camera = BaseCamera(camera_model=camera_model) if base_camera is not None: cls.cameras.setdefault(camera_id, base_camera) return cls.cameras.get(camera_id) else: return None except Camera.DoesNotExist: return None except CameraException: return None else: return camera

Django views.py:

from django.http import StreamingHttpResponse

from apps.device.Camera import CameraFactory, BaseCamera

def gen_display(camera: BaseCamera):
"""
    视频流生成器功能。
"""
    while True:

        frame = camera.get_frame()
        if frame is not None:
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

def video(request):
"""
    视频流路由。将其放入img标记的src属性中。
    例如:
"""

    camera_id = request.GET.get('camera_id')
    camera: BaseCamera = CameraFactory.get_camera(camera_id)

    return StreamingHttpResponse(gen_display(camera), content_type='multipart/x-mixed-replace; boundary=frame')

Original: https://blog.csdn.net/qq_42482078/article/details/123340441
Author: 北溪入江流
Title: 基于OpenCv+Django的网络实时视频流传输(前后端分离)



相关阅读

Title: 交通流预测爬坑记(一):交通流数据集,原始数据

目录

赠人玫瑰
基于OpenCv+Django的网络实时视频流传输(前后端分离)

如今网上有非常多的数据集,在CSDN,知乎什么搜一下可以找到一大堆,在收集数据时,发现很多数据集整理的文章都是写的一些论文中以及经过预处理的数据,我感觉这样的数据在从新写论文时使用起来非常不方便,因为不知道很多细节,所以我想写一写我搜集数据时搜集到的数据。

; 主要数据类型

个人出行数据,轨迹数据

推荐使用纽约公开数据集

高速公路观察点数据集

推荐使用英国高速公路数据集

其他

卡口、地铁等等

出行数据集

  • 郑宇,北京出租车数据集,应用于ST-ResNet,原始数据shape=(5596,2,32,32),"2"代表出In/Out两种流量。
    北京出租车数据集

原地址

https://github.com/amirkhango/DeepST/blob/master/deepst/models/STConvolution.py
百度网盘分享
链接:https://pan.baidu.com/s/1LY7kg6EP_hkcdINrm_szHg
提取码:0zhl

https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page

  • 滴滴盖亚计划数据集,链接就不放了。一搜就有
  • GeoLife GPS Trajectories
    该GPS轨迹数据集出自微软研究GeoLift项目。从2007年四月到2012年八月收集了182个用户的轨迹数据。这些数据包含了一系列以时间为序的点,每一个点包含经纬度、海拔等信息。包含了17621个轨迹,总距离120多万公里,总时间48000多小时。这些数据不仅仅记录了用户在家和在工作地点的位置轨迹,还记录了大范围的户外活动轨迹,比如购物、旅游、远足、骑自行车。

https://www.microsoft.com/en-us/download/details.aspx?id=52367

  • T-Drive Taxi Trajectories
    包含在2008年北京一万多俩出租车一周的轨迹数据。这个数据集包含了1500万个坐标点,轨迹的总距离达到900多万公里。

https://www.microsoft.com/en-us/research/publication/t-drive-trajectory-data-sample/

还有其他的数据集,大同小异,我感觉如何是分析出租车出行需求,使用上面这些,特别是纽约的就足够了,纽约数据集非常详细。
如果是要做这方面的,我有一些小小的思路
对数据进行处理方面

(方法一) 将数据根据经纬度与街道进行匹配,就像下面的图
基于OpenCv+Django的网络实时视频流传输(前后端分离)
(方法二) 将地图网络分成若干个小区域,
基于OpenCv+Django的网络实时视频流传输(前后端分离)

模型方法方面

方法一 CNN+LSTM CNN卷积图片,提取空间信息形成包含空间数据的时间序列,输入LSTM,预测

方法二 GCN 图卷积神经网络,这个还是比较新颖的,网上也有很多文章,就不展开说了(太菜)

; 高速公路数据集

  • 如果你能翻墙的话,可以尝试Pems{http://pems.dot.ca.gov/},在网页的左下角好像有个data点进去就可以,还需要注册账号。
  • 有一些开源的论文中使用了pems的数据,但是大部分都是经过预处理以后的数据,而且观察点需要自己再去找,我感觉比较麻烦,而且在做新研究时,预处理过的数据不是特别适宜。
    -下面就是一篇论文中提供的数据,我真的没办法用这样的数据去分析
    基于OpenCv+Django的网络实时视频流传输(前后端分离)
    还是放两个吧
  • Attention Based Spatial-Temporal Graph Convolutional Networks for Traffic Flow Forecasting (ASTGCN) 论文中使用的数据集以及代码。

https://codechina.csdn.net/mirrors/wanhuaiyu/ASTGCN?utm_source=csdn_github_accelerator

内容包括 基于OpenCv+Django的网络实时视频流传输(前后端分离)

  • Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting(DCRNN)

https://codechina.csdn.net/mirrors/liyaguang/DCRNN?utm_source=csdn_github_accelerator

内容包括
Los Angeles (METR-LA) :207个检测器2012年四个月的数据
the Bay Area (PEMS-BAY):325个检测器2017年6个月的数据

  • github 上各个领域公开的数据集 {https://github.com/awesomedata/awesome-public-datasets#transportation}, 里面包含很多数据集的内容,需要你花点时间去找,不只有交通的,还有其他的数据集,不多说可以看一下。
  • 美国一个大学提供的双子城{https://www.d.umn.edu/tdrl/services.htm}, 附近道路数据,但是数据格式一直没搞懂,如果有弄明白的朋友可以讨论交流一下。

上面这些,我其实并不是特别满意,太麻烦了,而且还需要看全英文的论文网页什么的,于是,不断的找啊找,终于

找到了英国高速公路数据集 {http://tris.highwaysengland.co.uk/detail/trafficflowdata},数据集网站包含英国M、A级基本上所有高速公路,数据非常全面,而且国内下载不限速 ,缺点就是只是统计时间是15分钟一次。
但这个网站只有数据没有观测点的位置,于是又经过不断的找啊找,观测点地图 {https://webtris.highwaysengland.co.uk/}, 也终于找到了,这两个一起,真就再也不用担心数据了,想要多少有多少

  • 文件内容:时间,流量,速度,占有率(需要自己算)

基于OpenCv+Django的网络实时视频流传输(前后端分离)

2021.7.29更新 英国高速数据网站也需要翻墙,请大家继续寻找别的数据集。

提供一个我已经下载的7个站点2个月的数据,位置在M25高速希思罗机场附近

链接:https://pan.baidu.com/s/1ykUKfGcjIsfCMHJbmky6NQ
提取码:mq0v

这一方面也有一些的小思路,但不详细说了,因为现在就在写这方面的论文,等论文写差不多在写专门的方法实现文章吧,如果有人想一起讨论,可以私聊,欢迎欢迎。

cnn+lstm+注意力
增加特定条件(天气呀,重大事件呀巴拉巴拉)
针对特定场景,使用现有模型去套到新的应用方向上

; 其他

  • 微软的城市计算{https://www.microsoft.com/en-us/research/project/%e5%9f%8e%e5%b8%82%e8%ae%a1%e7%ae%97/},里面包括一些与郑宇相关的论文,视频,数据等等
  • 深圳市政府数据开放平台{https://opendata.sz.gov.cn/}, 停车场数据、卡口过车数据、车流量数据、公交站点路线数据、营运车辆GPS数据、刷卡数据、街道实时数据、路段属性数据等等。
  • 地铁数据

天池比赛
https://tianchi.aliyun.com/competition/entrance/231708/introduction?spm=5176.12281957.1004.5.38b04c2alLBS7L

数据链接:https://pan.baidu.com/s/1wb6cXjSzFh9sy6jGB8aShQ
提取码:7g44

江西的一个比赛,提供下载
https://data.jiangxi.gov.cn/jxoda/login/toPages?file=home/quesData

Original: https://blog.csdn.net/K_first/article/details/115939390
Author: Meursault
Title: 交通流预测爬坑记(一):交通流数据集,原始数据

相关文章
模型训练——Loss函数 归纳汇总 人工智能

模型训练——Loss函数 归纳汇总

上一篇文章《语音降噪模型归纳汇总》,很意外地收到了点赞收藏和关注,如此的反馈给了我极大的鼓舞,这里就再梳理了一下loss函数相关的知识,以求方便能作为一份工具性质的文章展现出来。能力一般,水平有限,欢...
DBSCAN点云聚类 人工智能

DBSCAN点云聚类

1、DBSCAN算法原理 DBSCAN是一种基于密度的聚类方法,其将点分为核心点与非核心点,后续采用类似区域增长方式进行处理。下图为DBSCAN聚类结果,可见其可以对任意类别的数据进行聚类,无需定义类...
基于Tensorflow和Keras的环境配置 人工智能

基于Tensorflow和Keras的环境配置

Ancondad的安装 anconda的安装比较简单,找到与自己电脑相对应的版本下载安装即可,安装完打开 在以后的编程中建议一个项目构建一个环境,这样就不用担心各个版本之间的冲突问题 ; 常用的库的安...
无监督算法 人工智能

无监督算法

无监督算法简介 就是依靠数据之间的相似度,形成数据的类别。(下图有些是网上扒的,如有侵权望告知,立删) 层次聚类 比如有7个数据点,A,B,C,D,E,F,G。我们采用数据的欧式距离作为相似度(距离越...
opencv-python安装 人工智能

opencv-python安装

文章目录 前言 一、安装opencv-python库 二、opencv模块架构 * 1.模块 2.实例运行 总结 前言 OpenCV就是学习计算机视觉的过程中经常用到的工具,opencv降低了计算机视...
神经网络案例 人工智能

神经网络案例

目录 神经网络案例 * 数据加载 数据处理 模型构建 模型编译 模型训练 模型测试 模型保存 总结 神经网络案例 学习目标 能够利用tf.keras获取数据集 能够网络多层神经网络的构建 能够完成网络...
Clouda聊天室实践 人工智能

Clouda聊天室实践

1、Clouda说明 Clouda是简单,可依赖的实时Javascript框架。对一个想开发移动webapp的开发者来说,可以使用clouda开发框架,实现一个功能和体验与native app齐平的轻...
12-TensorFlow RNN的简单使用 人工智能

12-TensorFlow RNN的简单使用

1.RNN概念 RNN: 借助循环核(cell)提取特征后,送入后续网络(如全连接网络 Dense) 进行预测等操作。RNN 借助循环核从时间维度提取信息,循环核参数时间共享。 ; 1.循环核 循环核...
匿名

发表评论

匿名网友