基于Python实现人脸识别和焦点人物检测功能
作者:羊and船 发布时间:2021-03-09 10:27:45
写在前面的话
基于dlib库的模型,实现人脸识别和焦点人物的检测。最后呈现的效果为焦点人物的识别框颜色与其他人物框不一样。
准备工作
需要安装好python环境,安装好dlib、opencv-python库等,具体可以看报错信息(可以使用PyCharm来运行和编辑py文件),然后把需要的库补全,文章最后会有完整代码,但是需要与shape_predictor_68_face_landmarks.dat模型文件同处一个路径下,然后启用。(百度可以下载到)
设计过程
因为是在自己电脑完成的必做题设计,所以前期还经历了相应的Python安装与环境配置,相应的资源库安装,例如dlib、opencv-python等等。
然后运行综合了(68个人脸特征点检测模型完成静止图像的人脸检测与标注)和(完成实时摄制视频的人脸检测与定位)的参考文件opencv_webcam_face_detection.py,发现可以实现实时视频的人脸检测。
对参考文件的代码进行分析,理解每一句代码的意思。对比查找设计需要的功能模块,实现1280x720视频输出,实现类win10相机的焦点人物识别。
上网查找并学习相应资料,参考win10相机的算法,创建自己的基于距离与面积的焦点人物算法,根据自己的需要对源代码进行添加及修改。
最后对代码进行测试,且不断修改成最适合的版本。
Python程序
流程图
焦点人物算法
内在逻辑:模仿win10相机,当有多于1个人时,优先选择最居中的为焦点人物,但若在其他地方的人脸面积大于4倍中心的人脸面积,则选择其他地方的作为焦点人物。
实际代码
import dlib
import cv2
import math
# 摄像头参数设置
cam = cv2.VideoCapture(0) # 参数0,调用计算机的摄像头
cam.set(3, 1280) # 参数3,设定宽度分辨为1280
cam.set(4, 720) # 参数4,设定高度分辨为720
# 设定人脸框的边框颜色及宽度,便于分辨焦点人物
color_focus = (255, 0, 255) # 设定焦点人脸框的颜色,紫红色
color_other = (255, 255, 255) # 设定其余人脸框的颜色,白色
lineWidth_focus = 2 # 设定焦点人脸框的宽度
lineWidth_other = 1 # 设定其他人脸框的宽度
# 设定计算的一些参数
w = cam.get(3) / 2 # 设定屏幕中心的横坐标X
h = cam.get(4) / 2 # 设定屏幕中心的纵坐标Y
d_center = 10000 # 预设人脸框到屏幕中心的距离
index_center = 0 # 预设距离优先时的人脸框序号
index_area = 0 # 预设面积优先时的人脸框序号
area_center = -1 # 预设距离中心最近人脸框的面积
area = -1 # # 预设人脸框面积最大时的面积
detector = dlib.get_frontal_face_detector() # 加载这个库自带的人脸检测器
predictor_path = "shape_predictor_68_face_landmarks.dat" # 设置人脸预测模型的路径位置
predictor = dlib.shape_predictor(predictor_path) # 人脸预测实例化
while True: # 当获取到视频输入时
ret_val, img = cam.read() # 读取视频每一帧,颜色格式为BGR格式,
rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 颜色BGR格式转为RGB格式
faces = detector(rgb_image) # 返回RGB格式人脸捕捉框
# 逻辑算法:当有多于1个人时,优先选择最居中的为焦点人物,但若其他地方的人脸面积大于4倍中心的人脸面积,则选择该为焦点人物。
# 这个for循环先求出距离屏幕中心最近时的人脸框的序号和距离优先面积
for i, det in enumerate(faces): # 遍历所有人脸框,i是人脸框序号,det是每个人脸框
d = math.sqrt((w-(det.left()+(det.right()-det.left())/2))**2+(h-(det.top()+(det.bottom()-det.top())/2))**2)
# 计算该人脸框到屏幕中心的距离
if d < d_center: # 对比刚计算出的距离与设定的最近距离,达成选择更小
index_center = i # 更新距离最近时的人脸框序号
d_center = d # 更新最近距离
area_center = abs((det.right() - det.left()) * (det.bottom() - det.top())) # 算出该人脸框的面积(距离更近优先)
# 这个for循环求出面积最大的人脸框的序号和面积优先面积
for i, det in enumerate(faces): # 遍历所有人脸框,i是人脸框序号,det是每个人脸框
if abs((det.right() - det.left()) * (det.bottom() - det.top())) > area: # 对比该人脸面积与设定的最大面积,实现选择更大
index_area = i # 更新面积更大时的人脸框序号
area = abs((det.right() - det.left()) * (det.bottom() - det.top())) # 算出该人脸框的面积(面积更大优先)
if area > 5*area_center: # 判断依据,若面积优先面积大于距离优先面积的5倍,就实现面积优先选择焦点人物,否则就距离优先。
index_center = index_area # 面积优先时,使用面积最大的人脸框序号
for i, det in enumerate(faces): # 遍历所有人脸框
if i == index_center: # 确定焦点人脸框的序号
print(d_center, i) # 输出焦点人物的距离中心位置,方便调试
cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_focus, lineWidth_focus)
# 绘出焦点人脸框
shape = predictor(img, det) # 从预测模型处,得到68个人物特征点
for p in shape.parts(): # 遍历68个人物特征点
cv2.circle(img, (p.x, p.y), 2, (124, 252, 0), -1) # 设定焦点人物的68个点的形状颜色,茶绿色、实心
else:
cv2.rectangle(img, (det.left(), det.top()), (det.right(), det.bottom()), color_other, lineWidth_other)
# 绘出其他人脸框
shape = predictor(img, det) # 从预测模型处,得到68个人物特征点
for p in shape.parts(): # 遍历68个人物特征点
cv2.circle(img, (p.x, p.y), 2, (255, 255, 255), -1) # 设定其他人物的68个点的形状颜色,白色、实心
cv2.imshow('my webcam', img) # 输出绘好框后的帧动画
if cv2.waitKey(1) == 27: # 设置一个滞留时间,等待用户触发事件,若用户按下 ESC(ASCII码为27),则执行 if 体
break # (if主体)退出
cv2.destroyAllWindows() # 销毁所有输出图像窗
运行情况
为了容易分辨焦点人物与其他人物,首先将焦点人物框的宽度设为2,颜色设为紫红色,68个识别点设为茶绿色;其他人物框的宽度设为1,颜色设为白色,68个识别点设为白色。
然后进行多次测试,通过整理测试结果,发现算法没有错误,焦点人物按照距离和面积两个因素来决定。成功运行图如下:
不展示图了,但是主人物为紫红框,其他人物为白色圈。与预期一致。
来源:https://blog.csdn.net/m0_46140457/article/details/120791266
猜你喜欢
- 题目:给定两个自然数,求这两个数的最大公约数。分析:单看题目的话,非常简单,我们可以循环遍历自然数,如果能够整除两个自然数,就把这个数记下来
- 本文为大家分享了Python2.7与Python3.6环境切换的具体方法,供大家参考,具体内容如下系统支持为:Ubuntu18.04系统默认
- 抽象工厂模式抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。抽象工厂定义了用于创建不同产品的接口, 但将
- 本文实例为大家分享了Python实现打砖块游戏的具体代码,供大家参考,具体内容如下#导入模块import pygamefrom pygame
- 一、前言在学习深度学习会发现都比较爱用python这个argparse,虽然基本能理解,但没有仔细自己动手去写,因此这里写下来作为自己本人的
- Python编写微信小游戏“跳一跳”的运行脚本,分享给大家。更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪
- 项目信号处理和提取部分用到了matlab,需要应用到工程中方便研究。用具有万能粘合剂之称的“Python”。具体方法如下:1.python中
- 图像(包括动图)是传递信息的一种高效方式,往往能增强表象、记忆与思维等方面的反应强度。所谓一图胜千言,说的就是这个道理。今天为大家整理了十张
- 可以把多个页面相同的部分提取出来,放在一个母板里,这些页面只需要继承这个母板就好了通常会在母板中定义页面专用的 CSS 块和 JS 块,方便
- Flask 环境配置你的应用程序可能需要大量的软件包才能正常的工作。如果都不需要 Flask 包的话,你有可能读错了教程。当应用程序运行的时
- 用ACCESS数据库开发的网站,当随着网站数据量的不断增长.数据库的容量也是不断加大.这让ASP程序速度直线下降.如果才能让ACCESS数据
- 本文实例讲述了Python求导数的方法。分享给大家供大家参考。具体实现方法如下:def func(coeff): sum=
- 错误信息UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce i
- 1. 类的继承与方法的重载上面就是先定义了一个类A,然后由定义了一个类B,B继承了类A,这样B就有了A的非私有属性和方法。class Was
- 导语在设计论坛之前的讨论中曾经谈到过“设计师应该抓住这个时代的情感”,这是设计师的设计嗅觉和职业特性的体现,那么在纷纷扰扰中“裂变”的Web
- 本文实例讲述了Python实现查询某个目录下修改时间最新的文件。分享给大家供大家参考,具体如下:通过Python脚本,查询出某个目录下修改时
- 我的Windows 8.1 环境1.下载安装Python 2.7.6在Python官方网站中下载Python2.7.6的Windows安装包
- Python简介及入门python为什么是python选择自己喜欢的语言,这往往不容易,更多的是根据需求话说,之前是java,大学用了三年+
- 前言圣诞节快到了,是不是想用python画一个可爱的圣诞树,我在各大网站都查了一下,都不太美观,然后我就学习了一下别人的代码改写了一下,自己
- 目的临床数据的记录时间和对应标签(逗号后面的数字)记录在txt文件里,要把标签转换为3类标签,并且计算出每个标签的分别持续时间,然后绘制成柱