Python+OpenCV 简单实现人脸检测多个和人脸识别 2(附代码)

news/2024/5/19 5:14:49/文章来源:https://blog.csdn.net/qq_45956730/article/details/128996243

如果dilb和face_recognition第三方包安装失败,请移步到Python 解决dilb和face_recognition第三方包安装失败_水w的博客-CSDN博客

上篇请移步到Python+dilb 简单实现人脸检测(附代码)_水w的博客-CSDN博客

本篇是在上篇的工作基础上进行的。

目录

6 人脸检测多个

7 视频检测

8 拍照保存

9 训练数据

解决报错AttributeError: module 'cv2' has no attribute 'face'

10 人脸识别


6 人脸检测多个

整个代码如下: 

# 导入cv模块
import cv2 as cv# 检测函数
def face_detect_demo():gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier('D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')face = face_detect.detectMultiScale(gary)for x, y, w, h in face:cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)cv.imshow('result', img)# 读取图像
img = cv.imread('face2.jpg')
# 检测函数
face_detect_demo()
# 等待
while True:if ord('q') == cv.waitKey(0):break
# 释放内存
cv.destroyAllWindows()

效果如下: 

可以看到,大部分的人脸都被检测出来了。在人数很多的情况下,有一个没有被检测到,但在简单的场景下还是能基本完成要求的。

当然,我们也可以改变调用的这个haarcascade_frontalface_alt2.xml文件,换成该路径下的其他的,比如haarcascade_frontalface_default.xml,效果会稍有不同。

7 视频检测

整个代码如下: 

# 导入cv模块
import cv2 as cv# 检测函数
def face_detect_demo(img):gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier('D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')face = face_detect.detectMultiScale(gary)for x, y, w, h in face:cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)cv.imshow('result', img)# 读取摄像头
cap = cv.VideoCapture(0)
# 循环
while True:flag, frame = cap.read()if not flag:breakface_detect_demo(frame)if ord('q') == cv.waitKey(1):break
# 释放内存
cv.destroyAllWindows()
# 释放摄像头
cap.release()

此处就不展示效果了。

8 拍照保存

整个代码如下: 

# 导入模块
import cv2# 摄像头
cap = cv2.VideoCapture(0)falg = 1
num = 1while (cap.isOpened()):  # 检测是否在开启状态ret_flag, Vshow = cap.read()  # 得到每帧图像cv2.imshow("Capture_Test", Vshow)  # 显示图像k = cv2.waitKey(1) & 0xFF  # 按键判断if k == ord('s'):  # 保存cv2.imwrite("D:/mycodetest/opencv/data/jm/" + str(num) + ".123" + ".jpg", Vshow)print("success to save" + str(num) + ".jpg")print("-------------------")num += 1elif k == ord(' '):  # 退出break
# 释放摄像头
cap.release()
# 释放内存
cv2.destroyAllWindows()

此处就不展示效果了。

9 训练数据

整个代码如下: 

import os
import cv2
import sys
from PIL import Image
import numpy as npdef getImageAndLabels(path):facesSamples = []ids = []imagePaths = [os.path.join(path, f) for f in os.listdir(path)]# 检测人脸face_detector = cv2.CascadeClassifier('D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')# 打印数组imagePathsprint('数据排列:', imagePaths)# 遍历列表中的图片for imagePath in imagePaths:# 打开图片,黑白化PIL_img = Image.open(imagePath).convert('L')# 将图像转换为数组,以黑白深浅# PIL_img = cv2.resize(PIL_img, dsize=(400, 400))img_numpy = np.array(PIL_img, 'uint8')# 获取图片人脸特征faces = face_detector.detectMultiScale(img_numpy)# 获取每张图片的id和姓名id = int(os.path.split(imagePath)[1].split('.')[0])# 预防无面容照片for x, y, w, h in faces:ids.append(id)facesSamples.append(img_numpy[y:y + h, x:x + w])# 打印脸部特征和id# print('fs:', facesSamples)print('id:', id)# print('fs:', facesSamples[id])print('fs:', facesSamples)# print('脸部例子:',facesSamples[0])# print('身份信息:',ids[0])return facesSamples, idsif __name__ == '__main__':# 图片路径path = './data/jm/'# 获取图像数组和id标签数组和姓名faces, ids = getImageAndLabels(path)# 获取训练对象recognizer = cv2.face.LBPHFaceRecognizer_create()# recognizer.train(faces,names)#np.array(ids)recognizer.train(faces, np.array(ids))# 保存文件recognizer.write('trainer/trainer.yml')# save_to_file('names.txt',names)

效果如下: 会生成一个文件,文件的路径为trainer/trainer.yml。

解决报错AttributeError: module 'cv2' has no attribute 'face'

场景:在使用cv2.face.LBPHFaceRecognizer_create()进行人脸识别的操作时,会出现这样的提示。

recognizer = cv2.face.LBPHFaceRecognizer_create()

解决方法:之所以出现这种情况,是因为缺少了相关的包

从官网上我们看到,face模块实际上并不是opencv图书馆的一部分。更确切地说,face是部分的的opencv-contrib库。从自述文件:此存储库[ opencv-contrib]用于开发所谓的“额外”模块,提供功能。新模块通常没有稳定的API,并且它们没有经过良好测试。因此,它们不应作为官方OpenCV发行版的一部分发布,因为该库保持二进制兼容性,并试图提供良好的性能和稳定性。

(1)首先切换到你所在的环境(不建议在base环境中直接下载),接着就是下载我们需要的相关的包,用清华源下载快。

在pycharm的终端中,执行下条命令,

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python

安装成功,看到successfully之后就可以重新运行代码了。

ok,问题解决。

10 人脸识别

整个代码如下: 

import cv2, os
import numpy as np
# coding=utf-8
import urllib
import urllib.request
import hashlib# 加载训练数据集文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
names = []
warningtime = 0def md5(str):import hashlibm = hashlib.md5()m.update(str.encode("utf8"))return m.hexdigest()statusStr = {'0': '短信发送成功','-1': '参数不全','-2': '服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间','30': '密码错误','40': '账号不存在','41': '余额不足','42': '账户已过期','43': 'IP地址限制','50': '内容含有敏感词'
}def warning():smsapi = "http://api.smsbao.com/"# 短信平台账号user = '13******10'# 短信平台密码password = md5('*******')# 要发送的短信内容content = '【报警】\n原因:检测到未知人员\n地点:xxx'# 要发送短信的手机号码phone = '*******'data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content})send_url = smsapi + 'sms?' + dataresponse = urllib.request.urlopen(send_url)the_page = response.read().decode('utf-8')print(statusStr[the_page])# 准备识别的图片
def face_detect_demo(img):gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度face_detector = cv2.CascadeClassifier('D:/my/python-pycharm/python-envs/venv-deep/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')face = face_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))# face=face_detector.detectMultiScale(gray)for x, y, w, h in face:cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=1)# 人脸识别ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])# print('标签id:',ids,'置信评分:', confidence)if confidence > 80:global warningtimewarningtime += 1if warningtime > 100:warning()warningtime = 0cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else:cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)cv2.imshow('result', img)# print('bug:',ids)def name():path = './data/jm/'# names = []imagePaths = [os.path.join(path, f) for f in os.listdir(path)]for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.', 2)[1])names.append(name)cap = cv2.VideoCapture('1.mp4')
name()
while True:flag, frame = cap.read()if not flag:breakface_detect_demo(frame)if ord(' ') == cv2.waitKey(10):break
cv2.destroyAllWindows()
cap.release()
# print(names)

如果大家想要使用代码中提到的报警功能,首先需要先去马上使用更好的短信服务-短信宝官网这个网站去注册登录,才有账号。

此处由于我代码里写的账号信息不对,因此pycharm终端输出的是“密码错误”,正常情况下会显示发生短信成功。

效果如下: 

 

由于我们数据训练只加入了路径为./data/jm/1.lena.jpg一张图片,因此当执行代码建人脸识别时,它只能识别出这个叫lena的女孩,其他人脸识别出来都是会标注为“unknow”。

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

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

相关文章

【fastjson2.x 记录】那些从1.x升级到2.x踩过的坑

这篇文章主要记录升级到 fastjson2.x 版本后出现的一些问题 1. jar 包引入问题 问题描述:从 2.x 版本后,fastjson 貌似开始对代码模块进行了拆分,所以在调整配置的时候,会发现有些类突然没了,其实是需要引入其他的扩展…

基于springboot+vue的宠物商城系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

新能源汽车PK燃油汽车,首次胜出,输赢真的那么重要?

新能源汽车PK燃油汽车,输赢真的那么重要?是的。【科技明说 | 每日看点】今天看到一个新能源汽车领域的消息,我觉得很有意思,是说中国新能源汽车满意度水平首次超过了燃油汽车,你们觉得是这样么?…

ubuntu部署quark-5

下载源代码 解压zip sudo apt-get install unzip unzip xxxxx.zip安装所需要的包 sudo apt install python2 # 查看是否配置了默认的python sudo update-alternatives --list python若没有设置,会显示: # update-alternatives: error: no alterna…

Netty零拷贝机制

Netty零拷贝机制一:用户空间与内核空间二:传统IO流程三:零拷贝常见的实现方式1. mmap write2. sendfile四:Java中零拷贝五:Netty 中如何实现零拷贝1. CompositeByteBuf 实现零拷贝2. wrap 实现零拷贝3. slice 实现零拷…

CSP-《I‘m stuck!》-感悟

题目 做题过程 注:黄色高亮表示需要注意的地方,蓝色粗体表示代码思路 好久没有写过代码了,今天做这道编程题,简直是灾难现场。 上午编程完后发现样例没有通过,检查发现算法思路出现了问题:我计数了S不能到…

神经网络基础知识

神经网络基础知识 文章目录神经网络基础知识一、人工神经网络1.激活函数sigmod函数Tanh函数Leaky Relu函数分析2.过拟合和欠拟合二、学习与感知机1.损失函数与代价函数2. 线性回归和逻辑回归3. 监督学习与无监督学习三、优化1.梯度下降法2.随机梯度下降法(SGD)3. 批量梯度下降法…

Leetcode.1138 字母板上的路径

题目链接 Leetcode.1138 字母板上的路径 Rating : 1411 题目描述 我们从一块字母板上的位置 (0, 0)出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board ["abcde", "fghij", "klmno", "pqr…

第02章_MySQL环境搭建

第02章_MySQL环境搭建 讲师:尚硅谷 宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. MySQL的卸载 1.1 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务。按键盘上的“Ctrl …

应对新的挑战!ChatGPT将如何改变多域作战?

​公众号博主推送内容,未经许可,不得转载或者引用。 原文:Exploring the Possibilities of ChatGPT in Rugged Military AI Applications 《ChatGPT:利用最先进的技术支撑多域作战》 ChatGPT是一款基于GPT-3大型自然语言模型的…

JVM学习02:内存结构

JVM学习02:内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器(寄存器) 作用:是记住下一条jvm指令的执行地址 特点: 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…

rar压缩文件暴力破解

1. 简介 rar 压缩文件资源又不少是被加密的,密码通常也比较简单,我们可以通过暴力破解的方式来获取,通常耗时也比较小 程序地址:rar压缩密码暴力破解程序 2. 使用说明 2.1 基本语法 rar-bruteforce-crack.py [--start START] …

RocketMQ5.0.0消息存储<三>_消息转发与恢复机制

目录 一、消息转发 1. ReputMessageService线程初始化 2. 消息转发更新ConsumeQueue 3. 消息转发更新IndexFile 二、恢复机制 1. Broker加载存储文件 2. Broker正常退出的文件恢复 3. Broker异常退出的文件恢复 三、参考资料 一、消息转发 消息消费队列文件、索引文件…

DNS 原理入门指南(一)

DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作。我的目标是,读完此文后,你就能完全理解DNS。 一、DNS 是什么&#xff1…

Java中导入、导出Excel——HSSFWorkbook 使用

一、介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要…

字母板上的路径 题解,力扣官方出来挨打(小声)

字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动&#xff1a…

Python:路径之谜(DFS剪枝)

题目描述 小张冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走&#xf…

【微信小游戏开发笔记】第二节:Cocos开发界面常用功能简介

Cocos开发界面常用功能简介 本章只介绍微信小游戏开发时常用的功能,其他功能不常用,写多了记不住(其实是懒 -_-!): 层级管理器,用于操作各个节点。资源管理器,用于操作各种文件资源。场景编辑…

C/C++工业数据分析与文件信息管理系统[2023-02-12]

C/C工业数据分析与文件信息管理系统[2023-02-12] 程序设计基础A课程设计 工业数据分析与文件信息管理系统 题目背景 智能制造是以工业生产数据分析、自动化技术为基础,具有信息深度自感知、智慧优化自决策、精准控制自执行等功能,使制造活动达到安全…

sg3_utils arm64 静态编译

需求背景 在进行ufs等scsi device测试时,需要进行power mode切换等测试,因此需要有一个简单地工具集来向scsi device(ufs接口)发送scsi命令,比如 scsi reset命令等。在网上调研后发现sg3_utils是一个比较全面的工具。…