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;《人工智能之…

RandomShuffleQueue '_1_input/shuffle_batch/random_shuffle_queue' is closed and has insufficient elem

TensorFlow报错&#xff1a; RandomShuffleQueue _1_input/shuffle_batch/random_shuffle_queue is closed and has insufficient elements (requested 128, current size 0) image tf.decode_raw(features[image_raw], tf.float32) 将tf.float32改成tf.float64或者tf.uint…

Day10

会议讨论 628&#xff1a;今天是冲刺的最后一天了&#xff0c;好紧张好激动&#xff0c;我们组还有好些个功能没实现呢&#xff0c;感觉崩崩哒&#xff01;还要实现选择不同的专业导入不同的课表呢。 601&#xff1a;在修改教师帐号信息的页面要有当密码格式、用户名格式等不符…

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

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

读取打印TFRecord格式数据

在读取和打印TFRecord格式数据时&#xff0c;必须加入线程机制&#xff0c;否则打印不出任何结果 import tensorflow as tffilename_queue tf.train.string_input_producer([train.tfrecords], shuffleTrue) reader tf.TFRecordReader() _, serialized_example reader.read…

Java finally 的用法

Java finally 的用法&#xff0c;看这一篇就够了

我的iOS学习历程 - UISegmentedControl

今天学习的是UISegmentedControl,相当于一个切换的分区栏,例如看小说会分最新,最热等,可以用此控件来进行切换 1.初始化(用数组进行初始化)并添加到视图上 // 数组中初始化必须是字符串 或者 图片 // 如果选用图片初始化 必须使用镂空图NSArray *stringArray ["第…

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

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

numpy将bool值转换成数值

用np.array().astype(int) label np.array([0, 1, 0]) predict_label np.array([1, 0, 0]) false_num np.array(label ! predict_label).astype(int) print(false_num) # [1 1 0]

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

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

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

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

java对象初始化顺序

java对象初始化顺序

深度学习需要注意的11个方面

转自https://blog.csdn.net/u014365862/article/details/77961624 如果你的神经网络不工作&#xff0c;该怎么办&#xff1f;本文作者列举了搭建神经网络时可能遇到的11个常见问题&#xff0c;包括预处理数据、正则化、学习率、激活函数、网络权重设置等&#xff0c;并提供解决…

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

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

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

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

python中实现sigmiod功能

两种方法&#xff1a; 第一种&#xff1a;调用库函数 from scipy.special import expita np.array([[2.3, 5],[-0.2, -2]]) b expit(a) 第二种方法&#xff1a;自定义函数 def sigmoid(x):return 1.0 / (1.0 np.exp(-x))a np.array([[2.3, 5],[-0.2, -2]]) c sigmoid(…

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

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

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

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

centOS 搭建pipelineDB docs

#下载docs git clone https://github.com/pipelinedb/docs.git #安装python-sphinx &python-dev yum install install python-sphinx yum install python-devel.x86_64 #python安装sphinx && aws pip install sphinx_rtd_theme sphinx-autobuild awscli ---------…