OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

  • 一、人脸识别概要
    • 1.1 人脸检测
    • 1.2 人脸对齐(Face Alignment)
    • 1.3 人脸特征提取(Face Feature Extraction)
    • 1.4 人脸识别(Face Recognition)
  • 二、人脸检测(不是识别)的代码
    • 2.1 cv2.CascadeClassifier
    • 2.2 dlib库

一、人脸识别概要

一般而言,一个完整的人脸识别系统包含4个主要组成部分,即人脸检测人脸对齐(将侧脸或歪脸变成正面脸)、人脸特征提取以及人脸识别

四部分流水线操作:

  • 人脸检测在图像中找到人脸的位置;
  • 人脸配准在人脸上找到眼睛、鼻子、嘴巴等面部器官的位置;
  • 通过人脸特征提取将人脸图像信息抽象为字符串信息;
  • 人脸识别将目标人脸图像与既有人脸比对计算相似度,确认人脸对应身份。

1.1 人脸检测

人脸检测算法的输入是一张图片,输出是人脸框坐标序列。一般情况下,输出的人脸坐标框为一个正朝上的正方形,但也有一些人脸检测技术输出是正朝上的矩形,或者是带旋转方向的矩形。
在这里插入图片描述

1.2 人脸对齐(Face Alignment)

根据人脸图像,自动定位出人脸五官关键点坐标的一项技术。

人脸对齐算法的输入是“一张人脸图片”加“人脸坐标框”,输出五官关键点的坐标序列。五官关键点的数量是预先设定好的一个固定数值,可以根据不同的语义来定义(常见的有5点、68点等)。

对人脸图像进行特征点定位,将得到的特征点利用仿射变换进行人脸矫正,若不矫正,非正面人脸进行识别的准确率不高。
在这里插入图片描述

1.3 人脸特征提取(Face Feature Extraction)

将一张人脸图像转化为一串固定长度的数值的过程。

具有表征某个人脸特点能力的数值串被称为“人脸特征(Face Feature)”

在这里插入图片描述

1.4 人脸识别(Face Recognition)

识别出输入人脸图对应身份的算法。

输入一个人脸特征,通过和注册在库中N个身份对应的特征进行逐个比对,找出 “一个” 与输入特征相似度最高的特征。将这个最高相似度和预设的阈值进行比较,如果大于阈值,则返回该特征对应的身份,否则返回 “不在库中” 。
在这里插入图片描述

二、人脸检测(不是识别)的代码

2.1 cv2.CascadeClassifier

import cv2# 读入图像
img = cv2.imread("image/3.png")# 加载人脸特征,该文件在 python安装目录\Lib\site-packages\cv2\data 下
# 注意xml文件的路径一定要对
face_cascade = cv2.CascadeClassifier(r'image/haarcascade_frontalface_default.xml')
# 将读取的图像转为COLOR_BGR2GRAY,减少计算强度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测出的人脸个数
faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 4, minSize = (5, 5))print("Face : {0}".format(len(faces)))
print(faces)
# 用矩形圈出人脸的位置
for(x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.namedWindow("Faces")
cv2.imshow("Faces", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如下所示:
在这里插入图片描述

2.2 dlib库

ps:dlib库的安装可以自行百度。

dlib库是通过68特征点来识别人脸的:

# -*- coding:utf-8 -*-
import cv2
import dlib
import numpy as nppredictor_model = 'image/shape_predictor_68_face_landmarks/shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_model)# cv2读取图像
test_film_path = "image/3.png"
img = cv2.imread(test_film_path)
# 取灰度
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 人脸数rects
rects = detector(img_gray, 0)
print(rects[0])
for i in range(len(rects)):landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])print(landmarks, type(landmarks))for idx, point in enumerate(landmarks):# 68点的坐标pos = (point[0, 0], point[0, 1])#print(idx+1, pos)# 利用cv2.circle给每个特征点画一个圈,共68个cv2.circle(img, pos, 3, color=(0, 255, 0))# 利用cv2.putText输出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(idx+1), pos, font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)# cv2.imwrite("result.png", img)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如下所示:
在这里插入图片描述
68点坐标保存在一个np.martrix里:

[[ 95 137][ 98 162][104 187][108 212][117 235][131 255][149 272][170 285][192 289][215 285][235 270][253 251][266 229][272 205][276 180][283 156][285 131][101 114][116 106][134 107][153 110][172 117][209 117][227 109][246 106][265 105][282 113][190 135][191 153][191 172][192 189][177 199][184 203][192 205][201 203][208 199][125 135][136 127][151 127][163 139][149 143][135 143][219 138][230 127][245 126][257 134][247 142][232 142][161 235][172 226][185 219][193 222][200 219][212 226][224 235][213 247][201 252][193 252][184 252][172 247][168 235][185 231][193 232][200 232][217 235][201 235][193 236][185 235]] <class 'numpy.matrix'>

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

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

相关文章

清华大学:人工智能之知识图谱(附PPT)

来源&#xff1a;笑看国际风云【导读】知识图谱&#xff08;Knowledge Graph)是人工智能重要分支知识工程在大数据环境中的成功应用&#xff0c;知识图谱与大数据和深度学习一起&#xff0c;成为推动互联网和人工智能发展的核心驱动力之一。基于此背景&#xff0c;《人工智能之…

有关EUV光刻机,你需要知道这些

来源&#xff1a;technews晶圆制造产业进入7 纳米制程之后&#xff0c;目前全世界仅剩台积电与三星&#xff0c;再加上号称自家10 纳米制程优于竞争对手7 纳米制程的英特尔等&#xff0c;有继续开发能力之外&#xff0c;其他竞争者因须耗费大量金钱与人力物力的情况下&#xff…

多家巨头实测鸿蒙系统:比安卓快60%

来源&#xff1a;腾讯新闻&#xff0c;数码科技大爆炸众所周知&#xff0c;近期&#xff0c;华为被打压和打击的事件一直没有停止&#xff0c;但华为并没有坐以待毙&#xff0c;很快就启动了“备胎计划”给予积极的回击和反击&#xff0c;像保险柜里的海思“备胎芯片”、华为自…

混淆矩阵及分类性能评估方法

混淆矩阵&#xff1a; 公式&#xff1a;其中TPR又叫召回率Recall

《细胞》:打破百年生物学法则,记忆可以遗传给下一代,甚至可能跨越多代...

来源&#xff1a;转载自iNature许多人推测大脑活动可能以某种方式产生可遗传的变化&#xff0c;这将影响下一代的命运。然而&#xff0c;这一想法虽然具有吸引力&#xff0c;却挑战了生物学的基本法则之一&#xff0c;也被称为“生物学的第二定律”&#xff0c; “Weismann障碍…

欢迎参加城市大脑与智慧城市前沿趋势 主题论坛 |未来科技大讲堂 第12期

近年来&#xff0c;智慧城市建设出现新的动向&#xff0c;包括城市大脑、城市云脑、城市超级大脑、城市超脑、城市神经网络等“泛城市大脑”概念也大量涌现。杭州、上海、北京、广州等城市各自提出和开展了不同城市大脑建设方案&#xff0c;其中上海市开展了以建设城市神经元系…

JavaSE——Java介绍与环境变量简述

第1节 Java介绍 1、Java的起源与演变 略 2、Java体系与特点 Java体系 &#xff1a; Java SE&#xff1a;标准版&#xff1a;各应用平台的基础&#xff0c;桌面开发和低端商务应用的解决方案。 Java EE&#xff1a;企业版&#xff0c;以企业为环境而开发应用程序的解决方案…

深度:中国智能制造分析报告

来源&#xff1a;精智工厂亚洲正受到自动化、智能化大潮冲击。国际劳工组织调研发现&#xff0c;越南、柬埔寨、菲律宾和印度尼西亚的工人的失业风险最高&#xff0c;据估计这几个区域约50%的工人工作可能在未来20年被自动化取代。亚洲尤其是中国作为制造业的重要区域&#xff…

JavaSE——Java基础语法(二进制、变量、方法(函数)、运算符、转义字符)

第2节 基础语法 一、二进制 1.1 二进制介绍 计算机中的数据都以二进制数字保存。 二进制 &#xff1a;逢二进一&#xff0c;即只有0、1两个值。如十进制的10在计算机内保存为二进制的1010。 计算机中信息的存储单位&#xff1a; 位&#xff08;Bit&#xff09;&#xff1a…

我们离爱因斯坦想了解的“上帝的思想”,还有多远?

来源&#xff1a;原理1925年&#xff0c;爱因斯坦在与一位名为Esther Salaman的年轻学生一同散步的途中&#xff0c;分享了他的一个核心指导思想&#xff1a;“我想知道上帝是如何创造这个世界的。我对这个或那个现象&#xff0c;这个或那个元素的能谱不感兴趣。我要知道的是他…

城市大脑与智慧城市前沿趋势 主题论坛 |未来科技大讲堂 第12期

近年来&#xff0c;智慧城市建设出现新的动向&#xff0c;包括城市大脑、城市云脑、城市超级大脑、城市超脑、城市神经网络等“泛城市大脑”概念也大量涌现。杭州、上海、北京、广州等城市各自提出和开展了不同城市大脑建设方案&#xff0c;其中上海市开展了以建设城市神经元系…

JavaSE——数组基础(创建格式、下标、获取长度、常见问题、多维数组)

第4节 数组 一、概述 数组是相同数据类型的多个数据的容器。这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外&#xff0c;每一个元素都有唯一的前驱元素&#xff1b;除最后一个元素外&#xff0c;每一个元素都有唯一的后继元素。&#xff08;“简单理解就是&#xff…

MATLAB将颜色反转

如下图&#xff1a; 若需要将其转换为灰度图&#xff0c;则用colormap(gray)&#xff1a; 但若想将上面那幅灰度图颜色反转&#xff0c;即白色部分变黑&#xff0c;黑色部分变白&#xff0c;则用colormap(flipud(gray))&#xff1a;

AR/VR逐渐回暖 联合安防步入未来

来源&#xff1a;VR每日必看2019年&#xff0c;AR/VR市场在走过萌芽、兴起、狂热与泡沫破灭之后&#xff0c;开始逐渐复苏&#xff0c;相关芯片、屏幕、传感器等关键零部件也取得了不少进展&#xff0c;行业有望再次迎来高速增长。相较于C端市场&#xff0c;在B端&#xff0c;A…

JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)

第1节 面向对象基础 一、面向对象思想 1.1 概述 面向对象&#xff08;Object Oriented&#xff09;是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发&#xff0c;是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段的产物。面向对…

谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...

来源&#xff1a;凹非寺 机器学习全靠调参&#xff1f;这个思路已经过时了。谷歌大脑团队发布了一项新研究&#xff1a;只靠神经网络架构搜索出的网络&#xff0c;不训练&#xff0c;不调参&#xff0c;就能直接执行任务。这样的网络叫做WANN&#xff0c;权重不可知神经网络。它…

JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)

第2节 面向对象进阶 一、封装与private 概述&#xff1a; 封装的意义在于保护或者防止代码&#xff08;数据&#xff09;被我们无意中破坏。保护成员属性&#xff0c;不让类以外的程序直接访问和修改。封装原则&#xff1a; 隐藏对象的属性和实现细节&#xff0c;仅对外公开访…

孙正义:互联网流量将转化为智能AI流量,我的时代终于来了

“今后&#xff0c;增加软银集团的股东价值的成长引擎是什么呢&#xff1f;从上面的营业利润的增长来看&#xff0c;SVF&#xff08;软银愿景基金&#xff09;贡献了80%。SVF是SoftBank2.0最重要的经营引擎。首先&#xff0c;大约2年时间&#xff0c;SVF的投资对象已经超过了80…

JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)

第3节 面向对象高级 一、继承 1.1 概述和使用 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继…

word的公式后加编码后自动变小

如图所示&#xff0c;在公式后面加编码后公式也变小了&#xff1a; 加编码前&#xff1a; 加编码后&#xff1a; 采用样式分隔符&#xff08;Ctrlaltenter&#xff09;即可解决&#xff0c;输完公式后&#xff0c;按enter转行&#xff0c;输入你要的东西&#xff08;编号什么的…