摄像头对人脸进行性别和年龄的判断

摄像头对人脸性别和年龄判断

    • 导入必要的库
    • 加载预训练的人脸检测模型
    • 加载预训练的性别和年龄识别模型
    • 定义性别和年龄的标签列表
    • 打开摄像头
    • 从摄像头读取一帧
    • 转换为灰度图像
    • 检测人脸
    • 遍历检测到的人脸
    • 显示视频流
    • 按 ‘q’ 或点击窗口的“×”退出循环
    • 释放摄像头和销毁所有窗口
    • 全部代码

导入必要的库

cv2:OpenCV库,用于图像处理和摄像头操作。
numpy:用于数值计算。

import cv2
import numpy as np

加载预训练的人脸检测模型

使用cv2.CascadeClassifier加载Haar级联分类器,用于检测图像中的人脸。

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

加载预训练的性别和年龄识别模型

使用cv2.dnn.readNetFromCaffe加载Caffe模型,用于预测人脸的性别和年龄。

gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

定义性别和年龄的标签列表

创建两个列表,分别用于存储性别和年龄的标签。

gender_list = ['man', 'woman']
age_list = ['(0-10)', '(10-15)', '(15-20)', '(20-30)', '(45-55)', '(55-65)', '(65-80)', '(80-100)']

打开摄像头

使用cv2.VideoCapture(0)打开默认的摄像头。

cap = cv2.VideoCapture(0)

从摄像头读取一帧

使用cap.read()从摄像头捕获一帧视频。

while True:# 从摄像头读取一帧ret, frame = cap.read()if not ret:print("无法捕获视频流,请检查摄像头是否正常工作。")break

转换为灰度图像

使用cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)将捕获的帧从BGR格式转换为灰度格式。

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

检测人脸

使用face_cascade.detectMultiScale(gray, 1.1, 4)在灰度图像中检测人脸。

faces = face_cascade.detectMultiScale(gray, 1.1, 4)

遍历检测到的人脸

对于检测到的人脸,执行以下操作:
裁剪出人脸区域。
将裁剪出的人脸区域转换为Caffe模型所需的格式。
使用Caffe模型预测性别和年龄。
在原图上画出人脸框,并在框内显示性别和年龄。

for (x, y, w, h) in faces:# 从原始图像中裁剪人脸区域face_img = frame[y:y + h, x:x + w].copy()# 预处理人脸图像以适应神经网络输入blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)# 预测性别gender_net.setInput(blob)gender_preds = gender_net.forward()gender = gender_list[gender_preds[0].argmax()]# 预测年龄age_net.setInput(blob)age_preds = age_net.forward()age = age_list[age_preds[0].argmax()]# 在人脸周围画框并显示性别和年龄cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)cv2.putText(frame, f'{gender}, {age}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)

显示视频流

使用cv2.imshow(‘Gender and Age Recognition’, frame)在窗口中显示视频流。

cv2.imshow('Gender and Age Recognition', frame)

按 ‘q’ 或点击窗口的“×”退出循环

使用cv2.waitKey(1)等待用户按键。
如果用户按了’q’键或者关闭了窗口,则退出循环。

if cv2.waitKey(1) == 27 or cv2.getWindowProperty('Gender and Age Recognition', cv2.WND_PROP_VISIBLE) < 1:break

释放摄像头和销毁所有窗口

使用cap.release()释放摄像头。
使用cv2.destroyAllWindows()销毁所有OpenCV创建的窗口。

cap.release()
cv2.destroyAllWindows()

全部代码

import cv2
import numpy as np# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')# 定义性别和年龄的标签列表
gender_list = ['man', 'woman']
age_list = ['(0-10)', '(10-15)', '(15-20)', '(20-30)', '(45-55)', '(55-65)', '(65-80)', '(80-100)']# 打开摄像头
cap = cv2.VideoCapture(0)while True:# 从摄像头读取一帧ret, frame = cap.read()if not ret:print("无法捕获视频流,请检查摄像头是否正常工作。")break# 转换为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_cascade.detectMultiScale(gray, 1.1, 4)# 遍历检测到的人脸for (x, y, w, h) in faces:# 从原始图像中裁剪人脸区域face_img = frame[y:y + h, x:x + w].copy()# 预处理人脸图像以适应神经网络输入blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), (78.4263377603, 87.7689143744, 114.895847746), swapRB=False)# 预测性别gender_net.setInput(blob)gender_preds = gender_net.forward()gender = gender_list[gender_preds[0].argmax()]# 预测年龄age_net.setInput(blob)age_preds = age_net.forward()age = age_list[age_preds[0].argmax()]# 在人脸周围画框并显示性别和年龄cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)cv2.putText(frame, f'{gender}, {age}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2, cv2.LINE_AA)# 显示视频流cv2.imshow('Gender and Age Recognition', frame)# 按 'q' 或点击窗口的“×”退出循环if cv2.waitKey(1) == 27 or cv2.getWindowProperty('Gender and Age Recognition', cv2.WND_PROP_VISIBLE) < 1:break# 释放摄像头和销毁所有窗口
cap.release()
cv2.destroyAllWindows()

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

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

相关文章

python中的while循环

没有循环时&#xff0c;想打印0-100之间的数字&#xff0c;则需要循环多次&#xff0c;例&#xff1a; print(0) print(1) print(2) print(3) ... print(99) 但是使用循环的话&#xff0c;就不会有那么麻烦 while 循环 while 这个单词有“在……时”的含义&#xff0c;whil…

【UnityShader入门精要学习笔记】第十七章 表面着色器

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 表面着色器…

2024年手机能做的赚钱软件有哪些?整理了八个手机能做的正规赚钱软件分享

在这个指尖滑动的时代&#xff0c;手机不仅仅是通讯工具&#xff0c;更是我们探索财富的钥匙。你是否曾幻想过&#xff0c;躺在沙发上&#xff0c;轻轻一滑&#xff0c;就能让钱包鼓起来&#xff1f; 今天&#xff0c;就让我们一起来探索那些隐藏在手机里的赚钱秘笈&#xff0c…

使用 Vue 3 和 vue-print-nb 插件实现复杂申请表的打印

文章目录 1&#xff1a;创建 Vue 3 项目2&#xff1a;安装 vue-print-nb 插件3&#xff1a;配置 vue-print-nb 插件4&#xff1a;创建一个复杂的申请表5&#xff1a;使用 ApplicationForm 组件6&#xff1a;运行项目 在开发管理系统或申请表打印功能时&#xff0c;打印功能是一…

光伏无人机踏勘需要使用哪些设备?用到哪些原理?

随着全球能源结构的转型和绿色能源的大力推广&#xff0c;光伏电站的建设和运维正成为能源领域的热点。然而&#xff0c;光伏电站的选址、建设和后期运维过程中&#xff0c;往往面临着地形复杂、设备分散、巡检难度大等挑战。在这一背景下&#xff0c;无人机踏勘技术以其独特的…

qt程序打包成一个exe

首先在release模式下编译然后用windeployqt打包 具体步骤参照我这篇文章&#xff1a; https://blog.csdn.net/weixin_73548574/article/details/134932044 然后使用一个加壳工具&#xff1a;https://enigmaprotector.com/en/downloads.html 下载安装后打开 到此完成&#…

c++题目_P1546 [USACO3.1] 最短网络 Agri-Net

题目背景 Farmer John 被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。 题目描述 FJ 已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给其他农场。为了用…

数仓建模—指标拆解和选取

数仓建模—指标拆解和选取 第一节指标体系初识介绍了什么是指标体系 第二节指标体系分类分级和评价管理介绍了指标体系管理相关的,也就是指标体系的分级分类 这一节我们看一下指标体系的拆解和指标选取,这里我们先说指标选取,其实在整个企业的数字化建设过程中我们其实最…

进程和任务管理器

一、查看和控制进程 1.1ps命令 &#xff08;1&#xff09;ps 命令——查看静态的进程统计信息&#xff08;Processes Statistic&#xff09; PID TTY TIME CMD 1579 pts/1 00:00:00 bash 1730 pts/1 00:00:00 ps PID&#xff1a;进程IDTTY &#xff08;进程id&#xff0…

微信小程序发布遇到的一些问题记录

1.报错组件没有按需导入 在该路径配置微信小程序添加"lazyCodeLoading" : "requiredComponents" "mp-weixin" : { "appid" : "你的appid", "setting" : { "urlCheck" : f…

VS_图片转换点云

文章内容: 通过OpenCV读取图片数据将图片数据转换为点云显示点云保存点云到文件图片转换灰度图显示灰度图文章介绍 代码是用Ai工具生成后在VS上运行没有问题的。 可以参考里面读写PCL文件,PCL的显示等内容。 #include <opencv2/opencv.hpp> #include <pcl/io/pcd_…

ElementUI中date-picker组件,怎么给选择一个月份范围中大写月份改为阿拉伯数组月份(例如:一月、二月,改为1月、2月)

要将 Element UI 的 <el-date-picker> 组件中的月份名称从中文大写&#xff08;如 "一月", "二月"&#xff09;更改为阿拉伯数字&#xff08;如 "1月", "2月"&#xff09;&#xff0c;需要进行一些定制化处理。可以通过国际化&a…

企业微信接入系列-上传临时素材

企业微信接入系列-上传临时素材 文档介绍上传临时素材写在最后 文档介绍 创建企业群发的文档地址&#xff1a;https://developer.work.weixin.qq.com/document/path/92135&#xff0c;在创建企业群发消息或者群发群消息接口中涉及到上传临时素材的操作&#xff0c;具体文档地址…

网络服务DHCP的安装

DHCP的安装 检查并且安装dhcp有关软件包 rpm -qc dhcp #检查是否存在dhcp yum install -y dhcp #进行yum安装查看系统的配置文件 切换到对应目录查看相关文件配置&#xff0c;发现是空目录。 将官方提供的example复制到原配置文件中 cp /usr/share/doc/dhcp-4.2.5/dhcpd.…

Python | 链表的基础操作1

面向对象&#xff1a; “对象”实际上是对现实世界中所存在的事物的一种抽象 人拥有着一些静态的特征&#xff0c;比如身高、体重、性别等&#xff0c;也拥有一些动态的行为&#xff0c;比如吃法&#xff0c;睡觉等&#xff0c;而在计算机世界中&#xff0c;我们将之抽象为一个…

什么是室内外一体化定位

室内外一体化定位是一种技术&#xff0c;它允许在室内外环境中对设备或人员进行连续、无缝的定位跟踪。这种技术结合了多种定位技术的优势&#xff0c;以克服单一技术在室内外环境中可能遇到的局限性。 室内外一体化定位通常涉及以下几种技术&#xff1a; 1. 卫星定位系统&am…

汽车软件单元测试分析

汽车软件单元测试概述 随着汽车技术的不断发展,汽车的功能日益复杂,软件在汽车中的作用也变得越来越重要。汽车嵌入式软件的质量直接关系到汽车的安全性、可靠性和性能表现。在这样的背景下,汽车软件单元测试成为了确保软件质量的关键环节。 汽车嵌入式软件单元测试是指对汽…

手撕C语言题典——相交链表

目录 前言 一&#xff0c;思路 1&#xff09;暴力 2)同步指针 二&#xff0c;代码实现 前言 依旧是力扣上的一道题&#xff0c;有许多新思路提供给我们 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-li…

Go中字符串转成byte数组,会发生内存拷贝吗?

引言 在Go语言中&#xff0c;字符串和字节切片是两种常见的数据类型&#xff0c;它们在内存中的表现和操作方式有着本质的不同。字符串是不可变的&#xff0c;而字节切片则是可变的。在日常开发中&#xff0c;我们经常需要在这两种类型之间进行转换。那么&#xff0c;当字符串…

c#入门详解:接口详解

接口&#xff08;interface&#xff09; 抽象类中的抽象方法只规定了不能是 private 的&#xff0c;而接口中的“抽象方法”只能是 public 的。这样的成员访问级别就决定了接口的本质&#xff1a;接口是服务消费者和服务提供者之间的契约。既然是契约&#xff0c;那就必须是透…