欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中

【OpenCV DNN】Flask 视频监控目标检测教程 07

  • 3.7 OpenCV+Flask实时监控人脸识别
    • cvFlask08 项目的文件树
    • cvFlask08 项目的Python程序
    • cvFlask08 项目的网页模板
    • cvFlask08 项目的运行

本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。

本节介绍使用Flask框架构建一个视频流服务器,通过OpenCV捕获摄像头的实时画面,使用人脸检测级联分类器进行人脸识别,并在视频图像中标记检测到的人脸。

3.7 OpenCV+Flask实时监控人脸识别

进一步地,本例程使用Flask框架构建一个视频流服务器,通过OpenCV捕获摄像头的实时画面,使用人脸检测级联分类器进行人脸识别,并在视频图像中标记检测到的人脸。向服务器发送请求可以播放实时的视频流。

本项目的框架与cvFlask07相同。在定义的视频流类VideoStream中,增加了使用 Haar 级联检测器检测图片中的人脸,步骤如下:
(1)创建 CascadeClassifier 级联分类器对象,加载人脸检测预训练模型。
(2)对于捕获的视频帧,使用detectMultiScale()方法进行人脸检测,返回检测到人脸的边界矩形。
(4)将边界矩形绘制到视频帧上。

cvFlask08 项目的文件树

新建一个Flask项目。cvFlask08项目的文件树如下,增加了一个子目录models保存人脸检测预训练模型文件haarcascade_frontalface_alt2.xml。

OpenCV 提供了级联分类器的方法,也可以直接下载预训练模型后使用 load() 方法加载模型。OpenCV 提供的 Haar 级联检测器的预训练模型位于 OpenCV 安装包的 \data\haarcascades文件夹,或者从 【GitHub】opencv/data at 4.x 下载。

---文件名\|---models\|    |---haarcascade_frontalface_alt2.xml|---templates\|    |---index4.html|    |---index5.html
|--- cvFlask08.py
|--- vedio_01.mp4

cvFlask08 项目的Python程序

任务逻辑由Python程序文件cvFlask08.py实现,完整代码如下。

# cvFlask08.py
# OpenCV+Flask 图像处理例程 08
# 通过浏览器播放摄像头实时监控视频+人脸识别
# Copyright 2023 Youcans, XUPT
# Crated:2023-5-18# coding:utf-8from flask import Flask, Response, request, render_template
import cv2app = Flask(__name__)  # 实例化 Flask 对象# 定义视频流类
class VideoStream:def __init__(self, source):  # 传入视频源# if source == 'camera':#     self.video_cap = cv2.VideoCapture(0)  # 使用摄像头# else:#     self.video_cap = cv2.VideoCapture(source)  # 使用视频文件self.video_cap = cv2.VideoCapture(0)  # 创建视频读取对象# 加载 Haar 级联分类器 预训练模型model_path = "./models/haarcascade_frontalface_alt2.xml"# 加载人脸检测级联分类器self.face_cascade = cv2.CascadeClassifier(model_path)def get_frame(self):success, frame = self.video_cap.read()  # 读取视频帧if not success:return Nonegray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 使用级联分类器检测人脸faces = self.face_cascade.detectMultiScale(gray, scaleFactor=1.2,minNeighbors=5, minSize=(30, 30), maxSize=(300, 300))# 绘制人脸检测框for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x+w, y+h), (255,0,0), 2)ret, buffer = cv2.imencode('.jpg', frame)  # 编码为 jpg 格式frame_byte = buffer.tobytes()  # 转换为 bytes 类型return frame_bytedef __del__(self):self.video_cap.release()  # 释放视频流# 生成视频流的帧
def gen_frames(video_source):video_stream = VideoStream(video_source)  # 从视频文件获取视频流while True:frame = video_stream.get_frame()  # 获取视频帧if frame is None:# video_stream.__del__()  # 释放视频流breakyield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n'+ frame + b'\r\n')  # 生成视频流的帧@app.route('/video_feed')
def video_feed():video_source = request.args.get('video_source', 'camera')  # 从网页获取视频源# 通过将一帧帧的图像返回,就达到了看视频的目的。multipart/x-mixed-replace是单次的http请求-响应模式,如果网络中断,会导致视频流异常终止,必须重新连接才能恢复return Response(gen_frames(video_source), mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/')
def index_camera():  # 实时视频监控# <img src="{{ url_for('video_feed', video_source='camera') }}">return render_template('index4.html')@app.route('/vidfile')
def index_vidfile():  # 播放视频文件# <img src="{{ url_for('video_feed', video_source='vedio_01.mp4') }}">return render_template('index5.html')if __name__ == '__main__':# 启动一个本地开发服务器,激活该网页print("URL: http://127.0.0.1:5000")app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)  # 绑定 IP 地址和端口号

cvFlask08 项目的网页模板

视频流的网页模板index4.html和index5.html位于templates文件夹,内容与cvFlask07项目完全相同。

在子程序index()中指定了视频流的网页模板index4.html。

网页index4.html位于templates文件夹,具体内容如下。

<!DOCTYPE html>
<html><head><title>Video Streaming Demonstration</title></head><body><h2  align="center">OpenCV+Flask 例程:实时视频监控</h2><div style="text-align:center; padding-top:inherit"><img src="{{ url_for('video_feed', video_source='camera') }}" width="600"; height="360"></div></body>
</html>

网页index5.html位于templates文件夹,具体内容如下。

<!DOCTYPE html>
<html><head><title>Video Streaming Demonstration</title></head><body><h2  align="center">OpenCV+Flask 例程:播放视频文件</h2><div style="text-align:center; padding-top:inherit"><img src="{{ url_for('video_feed', video_source='vedio_01.mp4') }}" width="600"; height="360"></div></body>
</html>

cvFlask08 项目的运行

进入cvFlask08项目的根目录,运行程序cvFlask08.py,启动流媒体服务器。

 * Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:5000* Running on http://192.168.3.249:5000

在局域网内设备(包括移动手机)的浏览器打开http://192.168.3.249:5000就可以播放实时视频监控画面。

【本节完】

下节我们将讨论:OpenCV+Flask 实时监控人脸识别,添加控制按钮“Start/Stop”用来控制开始和停止播放视频流。

版权声明:
欢迎关注『OpenCV DNN @ Youcans』系列
youcans@xupt 原创作品,转载必须标注原文链接:
【OpenCV DNN】Flask 视频监控目标检测教程 07
(https://blog.csdn.net/youcans/article/details/131109284)
Copyright 2023 youcans, XUPT
Crated:2023-06-08

【OpenCV DNN】Flask 视频监控目标检测教程 07相关推荐

  1. 【OpenCV DNN】Flask 视频监控目标检测教程 04

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 04 3.4 用Flask构建流媒体服务器 3.4.1 流媒体服务器基本 ...

  2. 【OpenCV DNN】Flask 视频监控目标检测教程 02

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 01 [OpenCV DNN]Flask 视频监控目标检测教程 02 [ ...

  3. 用opencv的dnn模块做yolov5目标检测

    最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的.于是,我就想着编写一套用opencv的dnn模块做yol ...

  4. 深度学习 + OpenCV,Python实现实时视频目标检测

    选自PyimageSearch 机器之心编译 参与:路雪.李泽南 使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加 ...

  5. OpenCV+YOLO+IP摄像头实现目标检测

    title: OpenCV+YOLO+IP摄像头实现目标检测 前言 学习OpenCV.YOLO到现在我实现了调用本地摄像头使用自己训练的模型进行目标识别,然后想着能不能远程获取视频数据,然后再PC端处 ...

  6. 【mmdetection小目标检测教程】三、使用sahi库切分高分辨率图片,一键生成coco格式数据集

    [mmdetection小目标检测教程]三.使用sahi库切分高分辨率图片,一键生成coco格式数据集 1.确认是否需要切分图像 2.子图切分 (1)安装sahi库 (2)基于sahi切图 本文我们将 ...

  7. 养老院视频监控分析检测算法

    养老院视频监控分析检测算法通过借助计算机视觉深度学习技术以及yolo系列模型架构,对现场人员实时识别检测.Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,核心思想就是利用整张图 ...

  8. 道路运输车辆卫星定位系统企业监控平台标准符合性检测和道路运输车辆卫星定位系统企业视频监控平台检测攻略...

    卫星定位平台部标平台检测阶段步骤道路运输车辆卫星定位系统企业监控平台标准符合性检测和道路运输车辆卫星定位系统企业视频监控平台检测攻略 最新更新2019年9月9日16:21:37     步骤1.报名 ...

  9. OpenCV实现远程视频监控与运动目标检测

    远程视频监控与运动目标检测 本来是一次网络编程课的大作业,在做的过程中发现了蛮多问题,之后也一一调试完成,总的来说并不复杂,但也学到蛮多东西的,所以打算放上来 目的 随着图像处理技术和无线通信技术的发 ...

最新文章

  1. 数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
  2. ACCEPT()和ACCEPT4()
  3. python multiprocessing模块
  4. 成为“首席AI架构师”的全流程方法论
  5. PHP Mysql 网站迁移,Linux+PHP+MySql网站迁移配置
  6. php无限极 left right,php无限极分类实现的两种解决方法
  7. Deep_Rank,经典ctr系列预估模型复现框架
  8. 用python画圣诞树-Python――画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)...
  9. [PyTorch] reverse the normalization
  10. Centos6.x 64位 安装JDK
  11. python中哈希是什么意思_python 中倒是什么事可哈希的意思那?
  12. Linux主流架构运维工作简单剖
  13. 【图像边缘检测】基于matlab最小二乘法椭圆边缘检测【含Matlab源码146期】
  14. php字符串的截取方式
  15. 形象易懂的傅里叶变换、短时傅里叶变换和小波变换
  16. 压力换算公斤单位换算_压力表单位换算
  17. OpenLayers 5 使用turf.js渲染克里金插值计算的等值面
  18. 9个offer,12家公司,35场面试,从微软到谷歌,我的求职之路!
  19. 医疗是什么?AI医疗概念解析AI
  20. 博客网页代码块渲染-显示行号,一键复制,全屏显示,mac风格(基于mavon-editor或wangEditor)

热门文章

  1. C++回顾之前置++、后置++、不等号!及赋值运算符重载
  2. 重新过一遍ASP.NET 2.0(C#)(6) - MembershipRoleManager(成员资格和角色管理)
  3. DOM | DOM树 + 获取元素 +事件基础 + 常见的鼠标事件
  4. togglebutton用法 java_ToggleButton 基本使用方法
  5. 2011级同学加分通知(只针对河软高校俱乐部2011级同学)
  6. 计算机技巧资讯,如何让电脑不卡,分享几个屡试不爽的小技巧给大家
  7. Java nio 异常_java NIO异常问题
  8. FileSystemWatcher 只能响应一次
  9. TCP/IP四层模型重点协议解析
  10. 汶川地震,信息技术与死神赛跑