python简单实现人脸检测/跟随

news2024/11/25 14:43:15
import cv2

# 加载人脸识别器的模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 打开摄像头
cap = cv2.VideoCapture(0)

# 初始化人脸框位置
prev_faces = []

# 定义绘制带圆角矩形边框的函数
def draw_rounded_rectangle(img, x, y, w, h, radius, color, thickness):
    # 画上面的边框
    cv2.line(img, (x + radius, y), (x + w - radius, y), color, thickness)
    # 画下面的边框
    cv2.line(img, (x + radius, y + h), (x + w - radius, y + h), color, thickness)
    # 画左边的边框
    cv2.line(img, (x, y + radius), (x, y + h - radius), color, thickness)
    # 画右边的边框
    cv2.line(img, (x + w, y + radius), (x + w, y + h - radius), color, thickness)
    # 画左上角的圆弧
    cv2.ellipse(img, (x + radius, y + radius), (radius, radius), 180, 0, 90, color, thickness)
    # 画右上角的圆弧
    cv2.ellipse(img, (x + w - radius, y + radius), (radius, radius), 270, 0, 90, color, thickness)
    # 画右下角的圆弧
    cv2.ellipse(img, (x + w - radius, y + h - radius), (radius, radius), 0, 0, 90, color, thickness)
    # 画左下角的圆弧
    cv2.ellipse(img, (x + radius, y + h - radius), (radius, radius), 90, 0, 90, color, thickness)
# 定义平滑处理人脸位置的函数
def smooth_faces(faces, prev_faces=None, alpha=0):
    if prev_faces is None or len(prev_faces) == 0:
        return faces

    smoothed_faces = []
    for (x, y, w, h) in faces:
        found = False
        for (prev_x, prev_y, prev_w, prev_h) in prev_faces:
            if x - 30 <= prev_x <= x + 30 and y - 30 <= prev_y <= y + 30:
                smoothed_x = int(alpha * x + (1 - alpha) * prev_x)
                smoothed_y = int(alpha * y + (1 - alpha) * prev_y)
                smoothed_w = int(alpha * w + (1 - alpha) * prev_w)
                smoothed_h = int(alpha * h + (1 - alpha) * prev_h)
                smoothed_faces.append((smoothed_x, smoothed_y, smoothed_w, smoothed_h))
                found = True
                break

        if not found:
            smoothed_faces.append((x, y, w, h))

    return smoothed_faces

# 连续未检测到人脸的帧计数器
no_face_count = 0
max_no_face_count = 100  # 连续未检测到人脸的最大帧数

while True:
    # 读取摄像头图像
    ret, frame = cap.read()

    if not ret:
        # 如果无法读取摄像头图像,则退出循环
        break

    # 将图像转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    # 平滑处理人脸位置
    faces = list(faces)
    faces = smooth_faces(faces, prev_faces, alpha=0.3)
    prev_faces = faces.copy()

    # 在图像上绘制带圆角矩形边框
    if len(faces) > 0:
        for (x, y, w, h) in faces:
            # 绘制带圆角矩形边框
            radius = int(min(w, h) / 10)
            draw_rounded_rectangle(frame, x, y, w, h, radius, (18, 153, 255), 2)
            # 在人脸框上方显示文本信息
            text = "Face"
            font = cv2.FONT_HERSHEY_SIMPLEX
            font_scale = 0.8
            thickness = 2
            text_size, _ = cv2.getTextSize(text, font, font_scale, thickness)
            text_x = x + int((w - text_size[0]) / 2)
            text_y = y - 10
            cv2.putText(frame, text, (text_x, text_y), font, font_scale, (18, 153, 255), thickness, cv2.LINE_AA)
    # 显示图像
    cv2.imshow('Face Detection', frame)

    # 按下ESC键退出循环
    if cv2.waitKey(1) == 27:
        break

# 释放摄像头和关闭窗口
cap.release()
cv2.destroyAllWindows()



在这里插入图片描述

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

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

相关文章

C语言学习(三十一)---结构体、联合体的在内存中的存储

在上一篇文章中&#xff0c;我们学习了枚举、位段和联合体的相关内容&#xff0c;在文章的末尾&#xff0c;我们还差了关于联合体的存储问题的内容&#xff0c;今天我们将学习该部分的内容&#xff0c;好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#…

TiDB(2):TiDB架构特性

1 TiDB 整体架构 TiDB 集群主要包括三个核心组件&#xff1a;TiDB Server&#xff0c;PD Server 和 TiKV Server。此外&#xff0c;还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。 架构图解 1.1 TiDB Server TiDB Server 负责接收…

20个主流的代码生成LLM大模型及9种常见应用场景

基于生成式AI的代码生成&#xff08;Code Generation&#xff09;是一个重要的新领域&#xff0c;用于根据不完整的数据源、用另一种编程语言编写的程序、自然语言描述或执行日志来预测代码或程序结构。 多年来&#xff0c;开发人员经常从博客、帖子、文章和其他网站获取代码&…

vue引用百度地图,drawingManager.setDrawingMode不能接受参数,否则会报错

直接上部分代码&#xff1a; 引用百度地图后&#xff0c;没报错&#xff0c;但是鼠标绘制线路时报错&#xff1a; // 绘制点线 this.drawingManager new window.BMapLib.DrawingManager(this.map, { isOpen: true, //是否开启绘制模式 //enableDrawingTool: true, //是否显示…

数据结构 | 线索二叉树

一、数据结构定义 /* 线索二叉树 */ typedef char ThreadType; typedef struct ThreadNode {ThreadType data;struct ThreadNode* lchild, * rchild;int ltag, rtag; //左右线索标志 }ThreadNode, *ThreadTree; 二、方法概览 ThreadTree createTree(); //先序方法创建二叉树…

==和equals的区别

“”和equals 最大的区别是 “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c…

Jvisualvm内存模型剖析-JVM(五)

上篇文章代码讲解了tomcat加载以及gc回收流程。 Jvm内存模型剖析优化-JVM&#xff08;四&#xff09; Jvisualvm 我们可以编写如上代码&#xff0c;之后打开jvm自带的工具jvisualvm。 如果我们看visual不会明显变化&#xff0c;则可以修改睡眠参数&#xff0c;时间改小。 当…

【MySQL】根据MVCC和Read View分析事务的四种隔离级别在读写场景分别是如何体现其隔离性的

目录 一、数据库并发的三种场景 二、读写场景的MVCC 1、3个&#xff08;4个&#xff09;记录隐藏列字段 2、undo log&#xff08;撤销日志&#xff09; 3、模拟MVCC场景 3.1update场景 3.2delete场景 3.3insert 3.4select场景 4、Read View 5、RR和RC的区别 5.1当…

Squid 代理服务器应用

目录 一、Squid 概念1.1 代理的工作机制1.2 代理服务器的作用1.3 Squid 代理的类型 二、安装 Squid 服务2.1 编译安装 Squid2.2 修改 Squid 的配置文件2.3 Squid 的运行控制2.4 创建 Squid 服务脚本 三、构建传统代理服务器四、构建透明代理 服务器五、ACL 访问控制六、 日志分…

Python——模块与包

一、模块 &#xff08;1&#xff09;模块的定义 模块——Modules,通常一个py文件就是一个模块&#xff0c;我们在一个py文件里面会定义多个函数&#xff0c;也就是说一个模块中可以包含N多个函数。 &#xff08;2&#xff09;模块化编程的好处 ①方便其他程序和脚本的导入并使用…

从0到1精通自动化测试,pytest自动化测试框架,allure描述用例详细讲解(二十二)

一、前言 pytestallure是最完美的结合了&#xff0c;关于allure的使用&#xff0c;本篇做一个总结。 allure报告可以很多详细的信息描述测试用例&#xff0c;包括epic、feature、story、title、issue、testcase、severity等 环境准备&#xff1a; 1.python 3.6 2.pytest 4.5.…

使用Jetpack Compose创建滑动刷新(SwipeRefreshLayout)

Compose并未像View-based系统那样内建SwipeRefreshLayout。但Compose鼓励你自行创建需要的可组合函数&#xff0c;它提供了足够的工具供你完成此任务。 在本篇博客中&#xff0c;我们将展示如何在Jetpack Compose中创建滑动刷新界面的过程。但请注意&#xff0c;以下代码相当简…

flutter:实现一个简单的appBar上的搜索框、一个简单的搜索历史

搜索框 效果图 代码 import package:flutter/material.dart;class NovelSearch extends StatefulWidget {overrideState<StatefulWidget> createState() > _NovelSearchState(); }class _NovelSearchState extends State<NovelSearch> {String searchVal ;o…

DSP的CLA编程及注意事项之一

CLA简介 CLA(Control Law Accelerator),即控制律加速器&#xff0c;该 CLA 是完全可编程的独立 32 位浮点 CPU&#xff0c;专为优化数学密集型计算而设计&#xff0c;可显著提升控制算法的性能。与 执行指令和处理中断的标准传统处理器不同&#xff0c;CLA 实际上是任务驱动状…

Axure教程—上传文件

本文介绍用Axure制作文件上传效果 预览 预览地址&#xff1a;https://6q4of2.axshare.com 功能 1、点击”文件上传“按钮&#xff0c;显示上传的文件 2、点击”删除“图片&#xff0c;显示提示”是否要删除“&#xff0c;点击”是“&#xff0c;删除数据&#xff0c;点击”否…

开放式蓝牙耳机好不好,列举出几款值得入手的开放式蓝牙耳机

开放式耳机不仅能够提升幸福感还能听到周围环境声&#xff0c;大大提高安全性&#xff0c;不入耳不伤耳设计&#xff0c;既稳固又舒适&#xff0c;佩戴上耳无压力&#xff0c;还具有良好的音质和舒适的佩戴体验。但市面开放式耳机质量也参差不齐&#xff0c;有些使用感不佳&…

高压放大器使用说明书

高压放大器是一种电子设备&#xff0c;可以将输入信号的电能转换成输出信号的电能&#xff0c;从而实现信号放大的功能。它广泛应用于各种领域&#xff0c;例如通信、雷达、医疗等等。下面是一份高压放大器使用说明书&#xff0c;帮助用户更好地了解和使用该设备。 一、高压放大…

追思郭文彬:不管封我当什么长,下辈子我还当厨师!

6月28日&#xff0c;在北京联合大学旅游学院餐饮管理系的走廊&#xff0c;大大的长条桌上摆放着各类像生面点、面塑、包子等美食作品——牡丹、玉兰花、灯笼、小金鱼、花生、龙眼、山竹、翡翠白菜……作品精巧细致&#xff0c;形神兼备&#xff0c;宛若工艺品。 这些作品都出自…

MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询

文章目录 在 handle 包下新建Jsonb处理类方式一方式二 PostgreSQL jsonb类型保存新建数据库表含有jsonb类型创建实体类Control创建保存数据库方法发起请求 PostgreSQL jsonb类型查询Control创建查询数据库方法发起请求 在 handle 包下新建Jsonb处理类 方式一 import com.alib…

(css)el-image图片完整显示,不拉伸收缩

(css)el-image图片完整显示&#xff0c;不拉伸收缩 <el-imagefit"contain" //重要设置src"../../../../1.png"altclass"chenguo_img_img" />