OpenCV实现人脸检测和68点定位
人脸对比是现在比较常用的功能,比如出租车司机人脸与司机驾照照片对比,门禁系统中进入者的人脸与人脸库中的人脸进行对比。要实现人脸对比,首先要实现的是人脸检测,在摄像头拍摄到的一张图片中,正确的检测到人脸的位置,并且将人脸提取出来。
目录
1 原理先知
1.1 68点标定和OpenCV绘点
1.2 编码设计思路
1.3 OpenCV画图函数介绍
2 环境说明
3 实验内容
4 步骤详解
4.1 OpenCV实现人脸检测
4.2 人脸68点定位
1 原理先知
1.1 68点标定和OpenCV绘点
考虑到免费开源,OpenCV 就可以很好的实现这个功能。
这里使用OpenCV提供好的人脸分类模型xml:haarcascade_frontalface_alt_tree.xml。
同时利用Dlib官方给的人脸识别预测器“shape_predictor_68_face_landmarks.dat”进行68点标定(利用OpenCV进行图像化处理,在人脸上画出68个点,并标明序号)。
注:OpenCV人脸分类模型xml及Dlib人脸识别预测器下载地址
https://pan.baidu.com/s/1gZfYupoW9Zo_2lVV524cWA
提取码:w536
人脸68点定位工作内容主要以下两大块:68点标定 和 OpenCV绘点
- 68点标定:dlib提供了训练好的模型,可以识别人脸的68个特征点
- OpenCV绘点:画圆函数cv2.circle() 和 输出字符串函数 cv2.putText()
1.2 编码设计思路
- 调用dlib库来进行人脸识别,调用预测器“shape_predictor_68_face_landmarks.dat”
- 进行68点标定存入68个点坐标
- 利用cv2.circle来画68个点
- 利用cv2.putText()函数来画数字1-68
1.3 OpenCV画图函数介绍
- 画圆 cv2.circle( img, (p1,p2), r, (255,255,255) )
img 图片对象
(p1,p2) 圆心坐标
r 半径
(255,255,255) 颜色数组 - 输出字符 cv2.putText( img,"test", (p1,p2), font, 4, (255,255,255), 2, cv2, LINE_AA )
img 图像对象
"test" 需要打印的字符 text(数字的话可以利用str()转成字符)
(p1,p2) 坐标 textOrg
font 表示字体 fontFace(注意这里 font = cv2.FONT_HERSHEY_SIMPLEX)
4 表示字号 fontScale
(255,255,255) 颜色数组
2 线宽 thickness
LINE_AA 线条种类 line_type;关于颜色数组:(255,255,255), (蓝色,绿色,红色),每个值都是0-255。比如:蓝色(255,0,0),紫色(255,0,255)
2 环境说明
- Linux Ubuntu 16.04
- Python 3.6
- PyCharm Community2018
- Opencv-python 3.4.0.12
3 实验内容
- 使用haarcascade_frontalface_alt_tree.xml人脸分类模型检测人脸。
- 利用Dlib官方给的人脸识别预测器“shape_predictor_68_face_landmarks.dat”进行68点标定,利用OpenCV进行图像化处理,在人脸上画出68个点,并标明序号。
4 步骤详解
4.1 OpenCV实现人脸检测
首先将图片转换成灰色:使用 OpenCV 的 cvtColor() 转换图片颜色。
import cv2 filepath = "/data/opencv12/mv.jpg"
img = cv2.imread(filepath)
# 转换灰色,目的是在人脸检测时排除色彩的干扰
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示图像
cv2.imshow("original", img)
cv2.imshow("Image", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
之后使用训练分类器查找人脸:在使用 OpenCV 的人脸检测之前,需要一个人脸训练模型,格式是 xml 的,本实验中使用的是 OpenCV 提供好的人脸分类模型 xml:haarcascade_frontalface_alt_tree.xml。
Haar 特征分类器就是一个 XML 文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。
OpenCV中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)。
# 加载OpenCV人脸识别分类器
face_detector = cv.CascadeClassifier("haarcascade_frontalface_alt_tree.xml")
# 调用函数识别人脸
faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
最后在图片上画矩形:使用 OpenCV 的 rectangle() 绘制矩形。
color = (0, 255, 0)
if len(faceRects): # 大于0则检测到人脸 for faceRect in faceRects: # 单独框出每一张人脸 x, y, w, h = faceRect # x、y表示坐标;w、h表示矩形宽和高 # 框出人脸 cv2.rectangle(img, (x, y), (x + h, y + w), color, 2) # 左眼 cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),color) #右眼 cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),color) #嘴巴 cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),(x + 5 * w // 8, y + 7 * h // 8), color)
OpenCV实现人脸检测完整代码如下:
import cv2 filepath = "/data/opencv12/mv.jpg"
img = cv2.imread(filepath)
cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) classifier = cv2.CascadeClassifier("/data/opencv12/haarcascade_frontalface_alt_tree.xml")
faceRects = classifier.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) color = (0, 255, 0)
if len(faceRects): for faceRect in faceRects: x, y, w, h = faceRect cv2.rectangle(img, (x, y), (x + h, y + w), color, 2) cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),color) cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),color) cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),(x + 5 * w // 8, y + 7 * h // 8), color) cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV实现人脸检测运行结果如下所示。
4.2 人脸68点定位
除了使用 OpenCV 实现人脸检测之外,也可以借助比 OpenCV 更加精准的图片人脸检测 Dlib 库实现人脸 68 点定位。
首先导入需要调用的库。
import dlib #人脸识别的库dlib
from PIL import Image #图像处理的库PIL
import numpy as np #数据处理的库numpy
import cv2 #图像处理的库OpenCv
之后读取图片,并将图片转换为灰度图。
path = "/data/opencv12/mv.jpg"
img = cv2.imread(path)
cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
接下来读取训练模型,就可以检测脸部 68 特征点。
# 人脸分类器
detector = dlib.get_frontal_face_detector()
# 获取人脸检测器
predictor = dlib.shape_predictor("/data/opencv12/shape_predictor_68_face_landmarks.dat")
最后在人脸上遍历所有检测点并打上标注,并标注 1-68 数字。
rects = detector(gray, 0)
for i in range(len(rects)): landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()]) # 寻找人脸的68个标定点 # 遍历所有点,打印出其坐标,并圈出来,并标注1-68数字 for idx, point in enumerate(landmarks): pos = (point[0, 0], point[0, 1]) # 利用cv2.circle给每个特征点画一个圈,共68个 cv2.circle(img, pos, 3, color=(0, 255, 0)) # 利用cv2.putText输出1-68 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, str(idx+1), pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
人脸68点定位完整代码如下:
import cv2
import dlib
import numpy as np
path = "/data/opencv12/mv.jpg"
img = cv2.imread(path)
cv2.imshow("original", img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("/data/opencv12/shape_predictor_68_face_landmarks.dat")
rects = detector(gray, 0)
for i in range(len(rects)): landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()]) for idx, point in enumerate(landmarks): pos = (point[0, 0], point[0, 1]) cv2.circle(img, pos, 3, color=(0, 255, 0)) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, str(idx+1), pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow("imgdlib", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
人脸68点定位运行结果如下所示。
可以发现,dlib检测到人脸包括双眼、鼻子、嘴巴在内并用68点标注过的图片如下所示,并可以精准的定位检测人脸。
欢迎留言,一起学习交流~
感谢阅读
END
OpenCV实现人脸检测和68点定位相关推荐
- 利用OpenCV实现人脸检测
如何在一副图片中检测到人脸,这涉及到计算机图形学中一些非常复杂的计算,如果这些计算都靠程序员自己来编程,那么工作量就相当大.OpenCV全称是Open Computer Vision,是指开放的计算机 ...
- Python图像处理,cv2模块,OpenCV实现人脸检测蔡徐坤
前言 利用Python实现OpenCV实现人脸检测,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 ...
- flutter 人脸检测_【转载】opencv实现人脸检测
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...
- opencv实现人脸检测、性别和年龄预测
opencv实现人脸检测.性别和年龄预测 文章目录: 一.下载预训练的模型 1.下载模型 2.模型说明 二.实现步骤 1.加载模型 2.人脸检测 3.性别与年龄预测 4.完整代码 主要是通过openc ...
- 使用OpenCV进行人脸检测(Viola-Jones人脸检测方法)
扩展阅读: OpenCV用于人脸检测 参考文献:Paul Viola, Michael J. Jones. Robust Real-Time Face Detection[J]. Internatio ...
- OpenCV Dbt人脸检测Dbt face detection的实例(附完整代码)
OpenCV相 Dbt人脸检测Dbt face detection的实例 OpenCV Dbt人脸检测Dbt face detection的实例 OpenCV Dbt人脸检测Dbt face dete ...
- java 人脸检测_Java+OpenCV实现人脸检测并自动拍照
java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBas ...
- 【opencv】人脸检测(图片实时)
■ 人脸检测(图片) 原图像: 在使用OpenCV的人脸检测之前,需要一个人脸训练模型,格式是xml的,我们这里使用OpenCV提供好的人脸分类模型xml,下载地址:https://g ...
- python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容
python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容 1 pyzbar二维码检测模块 1.1. pyzbar模块介绍 1.2 pyzbar ...
最新文章
- java单循环 比较得分_java – 为什么两个单独的循环比一个快?
- Mybatis源码解读-设计模式总结
- Android复习03(Get请求访问网络[详解]、获取文章列表)
- centos 下安装man手册
- Linq找不到行或行已更改
- VOC标签转化为YOLO标签
- 利用webBrowser来实现自动登录网站
- 《变革中的思索》连载九:放飞的爱——母亲和我
- [转载].net常用函数
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- 【差分算法入门】例题讲解(代码逐句分析)
- 机器人控制算法----模糊控制
- Skyline TEP5.1.3二次开发入门——初级(四)
- linux进阶-scp命令及相关传输命令全get
- 明日之后八级房怎么造?明日之后好看的八级房蓝图造型汇总
- 毕设之基金定投小程序
- Direct I/O in DOSBOX for COMM serial communications with QBasic, TBasic or Pbasic
- jquery 处理页面的事件详解
- 深入了解PHP8 JIT(即时编译)功能
- 石康,你别再让我越来越厌恶了,行不行
热门文章
- window系统上安装oracle
- csv文件加bom python_CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)
- 基于linux的openwrt基础教程图解
- 携程酒店数据爬取2020.5
- echart中国地图,多地图案例
- 安装solidworks 显示:Flexnet Licence Manager is not successfully installed as a service in your system
- 头牌知产介绍喷雾机商标转让类别属于第几类?
- 读决战大数据-车品觉
- 120941138报:工信部正搭建移动应用认证和管理服务
- 使用IDEA导出JAR包