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

news2024/11/24 18:29:18

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

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

    • 3.8 OpenCV+Flask实时监控人脸识别+控制按钮
      • 新建 Flask 项目 cvFlask08c
      • Python程序文件
      • 视频流的网页模板
      • 程序运行


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

上节介绍使用Flask框架构建一个视频流服务器,通过OpenCV捕获摄像头的实时画面,使用人脸检测级联分类器进行人脸识别,并在视频图像中标记检测到的人脸。本节我们添加一个控制按钮“Start/Stop”用来控制开始和停止播放视频流,一个帮助按钮“Help”用来提升帮助学习。


3.8 OpenCV+Flask实时监控人脸识别+控制按钮

进一步地,我们添加一个控制按钮“Start/Stop”用来控制开始和停止播放视频流,一个帮助按钮“Help”用来提升帮助学习。

我们在前端添加控制按钮“Start/Stop”,“Start”按钮用于开始播放视频,“Stop”按钮用于停止播放视频。点击这两个按钮时,会调用相应的 JavaScript 函数来显示或隐藏视频和按钮。帮助按钮“Help”使用JavaScript的alert()方法,在用户点击按钮时显示帮助信息。

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


新建 Flask 项目 cvFlask08c

新建一个Flask项目cvFlask08c,本项目的框架与cvFlask08相同。
cvFlask08c项目的文件树如下。

---文件名\
    |---models\
    |    |---haarcascade_frontalface_alt2.xml
    |---templates\
    |    |---index4c.html
|--- cvFlask08c.py

注意增加了一个子目录models保存人脸检测预训练模型文件haarcascade_frontalface_alt2.xml。

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

OpenCV 提供的 haar 级联检测器的预训练模型包括:

haarcascade_eye.xml, 眼睛
haarcascade_eye_tree_eyeglasses.xml, 戴眼镜的眼睛
haarcascade_frontalcatface.xml, 正面猫脸
haarcascade_frontalcatface_extended.xml, 正面猫脸
haarcascade_frontalface_alt.xml, 正面人脸
haarcascade_frontalface_alt2.xml, 正面人脸
haarcascade_frontalface_alt_tree.xml, 正面人脸
haarcascade_frontalface_default.xml, 正面人脸
haarcascade_fullbody.xml, 人体
haarcascade_lefteye_2splits.xml, 左眼
haarcascade_license_plate_rus_16stages.xml, 
haarcascade_lowerbody.xml, 
haarcascade_profileface.xml, 
haarcascade_righteye_2splits.xml, 右眼
haarcascade_russian_plate_number.xml, 
haarcascade_smile.xml, 笑脸
haarcascade_upperbody.xml, 上身


Python程序文件

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

# cvFlask08c.py
# OpenCV+Flask 图像处理例程 08
# 通过浏览器播放摄像头实时监控视频+人脸检测+控制按钮
# Copyright 2023 Youcans, XUPT
# Crated:2023-5-18

# coding:utf-8
from flask import Flask, render_template, Response
import numpy as np
import cv2

app = Flask(__name__)

# 定义视频流类
class VideoCamera(object):
    def __init__(self):
        # 创建视频捕获对象,调用笔记本摄像头
        self.video = cv2.VideoCapture(0)  # 修改 API 设置为视频输入

        # 加载 Haar 级联分类器 预训练模型
        model_path = "./models/haarcascade_frontalface_alt2.xml"
        # 加载人脸检测级联分类器
        self.face_cascade = cv2.CascadeClassifier(model_path)
        print(type(self.face_cascade))

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

    def get_frame(self):
        success, image = self.video.read()
        gray = cv2.cvtColor(image, 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(image, (x, y), (x + w, y + h), (255, 0, 0), 2)

        ret, buffer = cv2.imencode('.jpg', image)  # 编码为 jpg 格式
        frame_byte = buffer.tobytes()  # 转换为 bytes 类型
        return frame_byte

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

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')

@app.route('/video_feed')
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    print("Running on http://127.0.0.1:5000")
    print("Running on http://192.168.3.249:5000")
    app.run(host='0.0.0.0', port=5000, debug=True)

视频流的网页模板

视频流的网页模板 index4c.html 位于templates文件夹。控制开始和停止播放视频流的控制按钮“Start/Stop”和帮助按钮“Help”,都是在网页模板 index4c.html 中定义的。

内容如下。

<!DOCTYPE html>
<html>
<head>
    <title>Video Streaming</title>
    <style>
    #video {
        display: block;
        margin: 0 auto;
        width: 600px;
        height: 360px;
    }
    #button-container {
        display: flex;
        justify-content: center;
        gap: 100px;
        margin-top: 10px;
    }
    button {
        width: 60px;
        height: 30px;
    }
    </style>
</head>
<body>
    <h2 style="text-align:center">OpenCV+Flask 例程:实时视频监控</h2>
    <img id="video" src="" style="display: block">
    <div id="button-container">
        <button id="start" onclick="start()">Start</button>
        <button id="stop" onclick="stop()" style="display: none">Stop</button>
        <button id="help" onclick="help()">Help</button>
    </div>

    <script>
    function start() {
        document.getElementById("video").src = "{{ url_for('video_feed') }}";
        document.getElementById("start").style.display = "none";
        document.getElementById("stop").style.display = "inline";
    }

    function stop() {
        document.getElementById("video").src = "";
        document.getElementById("start").style.display = "inline";
        document.getElementById("stop").style.display = "none";
    }

    function help() {
        alert("This is an OpenCV+Flask routine. OpenCV reads the camera in real-time, uses a cascaded classifier to detect faces for face detection, and the browser plays monitoring videos in real-time.");
    }
    </script>
</body>
</html>

程序运行

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

在局域网内设备(包括移动手机)的浏览器打开http://192.168.3.249:5000,点击“Start”按钮,就可以播放视频监控画面。画面中检测到的人脸,用蓝色方框标记。

在这里插入图片描述


【本节完】

下节我们将讨论:OpenCV+Flask 多线程处理实时监控人脸识别。


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nature子刊:生物合成硝基化蛋白,助力解决药物免疫耐受!

氨基酸是蛋白质的单个构建模块&#xff0c;对生物系统的正常运转至关重要。所有生物系统中的蛋白质都是由20种标准氨基酸组成的&#xff0c;自然界中还发现了超过500种不同类型的其他氨基酸&#xff0c;以及大量的人造氨基酸。其中一些替代氨基酸有助于创造新类型的药物和治疗方…

阿里企业邮箱注册流程(新手指南)

阿里云企业邮箱购买流程&#xff0c;企业邮箱分为免费版、标准版、集团版和尊享版&#xff0c;阿里云百科分享企业邮箱版本区别&#xff0c;企业邮箱收费标准价格表&#xff0c;以及阿里企业邮箱详细购买流程&#xff1a; 目录 阿里云企业邮箱购买流程 一、阿里云账号注册及…

驱动开发:内核ShellCode线程注入

还记得《驱动开发&#xff1a;内核LoadLibrary实现DLL注入》中所使用的注入技术吗&#xff0c;我们通过RtlCreateUserThread函数调用实现了注入DLL到应用层并执行&#xff0c;本章将继续探索一个简单的问题&#xff0c;如何注入ShellCode代码实现反弹Shell&#xff0c;这里需要…

ChatGPT 背后的技术重点:RLHF、IFT、CoT、红蓝对抗

近段时间&#xff0c;ChatGPT 横空出世并获得巨大成功&#xff0c;使得 RLHF、SFT、IFT、CoT 等这些晦涩的缩写开始出现在普罗大众的讨论中。这些晦涩的首字母缩略词究竟是什么意思&#xff1f;为什么它们如此重要&#xff1f;我们调查了相关的所有重要论文&#xff0c;以对这些…

Go1.21 速览:go.mod 的 Go 版本号将会约束 Go 程序构建,要特别注意了!

大家好&#xff0c;我是煎鱼。 之前 Go 核心团队的负责人 Russ Cox 针对 Go 的向前兼容&#xff08;指的是旧版本的 Go 编译新的 Go 代码&#xff09;&#xff0c;进行了进一步的设计。 重点内容如下&#xff1a; 新增 GOTOOLCHAIN 环境变量的设置。改变在工作模块&#xff08;…

阿里云弹性公网EIP收费价格表

阿里云弹性公网EIP怎么收费&#xff1f;EIP地域不同价格不同&#xff0c;EIP计费模式分为包年包月和按量付费&#xff0c;弹性公网IP可以按带宽收费也可以按使用流量收费&#xff0c;阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

cpp新小点1

这里写目录标题 argc argv继承虚继承多态override不加override overload纯虚函数和抽象类虚析构和纯虚析构 static和 constexternself前置 后置默认构造 析构继承构造函数不能是虚函数派⽣类的override虚函数定义必须和⽗类完全⼀致。 有特列何时共享虚函数地址表 智能指针arrm…

【数据库必备知识】上手表设计

目录 &#x1f4d6;前言 1. 基本步骤 1.1 梳理清楚需求中的实体 1.2 梳理清楚实体间的关系 2. 实体间的三种关系 2.1 一对一 2.2 一对多 2.3 多对多 &#x1f389;小结ending &#x1f4d6;前言 本文讲解的是基本的表设计, 设计一般只有在有一定实际项目经验后, 才能…

MAVEN - 使用maven-dependency-plugin的应用场景是什么?

简述 maven-dependency-plugin是MAVEN的一个插件。 作用 该插件主要用于管理项目中的依赖&#xff0c;使用该插件可以方便地查看、下载、复制和解压缩依赖&#xff0c;还支持生成依赖树和依赖报告。 功能 该插件有很多可用的GOAL&#xff0c;大部分与依赖构建、依赖分析和依…

《面试1v1》Map

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 《面试1v1》 连载中… 面试官&#xff1a; 小伙子,又来挑战你了。听说你对Java集合中的Map也很在行? 候选人&#xff1a; 谢谢夸奖,Map这个接口的确非常重要且强大…

SpringMVC原理分析 | JSON、Jackson、FastJson

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; JSON JSON&#xff08;JavaScriptObject Notation&#xff0c;JS对象简谱&#xff09;是一种轻量级的数据交换格式。它基于 ECMAScript&#xff08;European Computer…

无自注意力照样高效!RIFormer开启无需token mixer的Transformer结构新篇章

©PaperWeekly 原创 作者 | 岳廷 研究方向 | 计算机视觉 引言 论文地址&#xff1a; https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_RIFormer_Keep_Your_Vision_Backbone_Effective_but_Removing_Token_Mixer_CVPR_2023_paper.pdf 问题&#xff1a;Vision …

如何将代码中的相关调试信息输出到对应的日志文件中

一、将调试信息输出到屏幕中 1.1 一般写法 我们平常在写代码时&#xff0c;肯定会有一些调试信息的输出&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {char szFileName[] "test.txt";FILE *fp fopen(szFileName, "r")…

R语言 tidyverse系列学习笔记(系列5)dplyr 数据分析之across

成绩单 score install.packages("dplyr") library(dplyr)install.packages("tibble") library(tibble)install.packages("stringr") library(stringr)score tibble(IDc("1222-1","2001-0","3321-1","4898-…

MySQL(八):排序与分页

排序与分页 前言一、排序数据1、排序规则2、单列排序3、多列排序 二、分页1、背景2、实现规则3、拓展 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01;也许一个人独行&#xff0c;可以走的很快&…

从零开始Vue项目中使用MapboxGL开发三维地图教程(三)添加全屏,缩放旋转和比例控制面板以及自定义图标、标记点击弹窗、地图平移等功能

文章目录 1、添加各种控制面板1.1、添加全屏1.2、缩放旋转控制1.3、比例尺 2、获取并显示鼠标移动位置的经纬度坐标3、添加图标3.1、添加图片图层的图标3.2、添加带有标记的自定义图标3.3、悬停时显示弹出窗口 1、添加各种控制面板 1.1、添加全屏 //添加全屏控制this.map.addC…

管理类联考——逻辑——知识篇——第一章 性质命题

第一章 性质命题&#xff08;最基础&#xff0c;最难*****&#xff09; 一、性质命题定义&#xff08;必考&#xff09; 判断事物具有或不具有某种性质的命题。 二、性质命题的四种基本形式 全称肯定&#xff1a;①所有的A都是B 全称否定&#xff1a;②所有的A不是B 特称肯…

Nature子刊:光遗传在绒猴执行检测任务中的行为效应

狨猴体型小&#xff0c;具有巨大的基因修饰潜力&#xff0c;并可表现复杂的行为&#xff0c;已经成为神经科学领域的一个关键模型。 德国恩斯特斯特朗格曼神经科学研究所与马克斯普朗克学会的研究人员设计了一种轻质的、3D打印的植入物&#xff0c;利用高密度硅基微电极阵列&am…

Monorepo vs. Microrepo: 选择适合你的代码仓库策略

简介 在软件开发领域&#xff0c;选择合适的代码仓库策略对于优化协作、可扩展性和代码质量至关重要。Monorepo和Microrepo是两种流行的方法&#xff0c;它们提供了各自的优势和考虑因素。本文将探讨这两种策略的特点&#xff0c;解释为何不同的公司选择不同的选项&#xff0c;…

基于Hexo和Butterfly创建个人技术博客,(5) 使用Hexo的Tags Plugin插件增强博客文章内容和视觉表现力

Hexo官司网查看 这里 注意&#xff1a; Tags语法是Hexo插件提供的&#xff0c;是非标准语言&#xff0c;写文章时要注意以下几点&#xff1a; 用于在文章中快速插入特定的内容&#xff0c;作用等同于其它语言&#xff0c;可理解为一种增强版本的markdown&#xff1b;可混合Mark…