OpenCV中有许多可以进行人脸、人眼检测的特征文件,今天我们利用OpenCV中自带的特征文件haarcascade_frontalface_default.xml来进行人脸检测。

【OpenCV实战】OpenCV实现人脸检测“超详解”(含代码)

  • 1、整体思路
  • 2、代码详解
    • 2.1从百度爬取图片
    • 2.2训练数据
    • 2.3测试,绘制框和标签
  • 3、总结
  • 4、参考

1、整体思路

第一:利用Python根据特征词从百度爬取人物图片
第二:训练
第三:测试,绘制框和标签

2、代码详解

2.1从百度爬取图片

本段代码实现的功能:根据特征词从百度爬取一定数量的图片

import requests
import os
import re# word是要爬的图片名字;max_num 是要爬取的数量
word = input("请输入关键词:")
max_num = input("请输入图片最大数量:")
# j用来标记图片数量
j = 1#爬取图片的类
class PaChong:def __init__(self, word, i):# path是图片存放的地方self.path = "./xqImg/" + word + "/"#         第几页self.page = i / 10 + 1# 如果文件夹不存在,则创建文件夹if not os.path.exists(self.path):os.mkdir(self.path)# 发出requests请求def requests_get(self, url):req = requests.get(url, timeout=30)req.encoding = "utf-8"self.req = req.text# 正则找到图片链接def get_imgurl(self):imgurls = re.findall('"objURL":"(.*?)"', self.req, re.S)self.imgurls = imgurlsprint(self.imgurls)# 下载图片到本地def download(self):global jfor imgurl in self.imgurls:path = self.path + str(j)#try可以防止因网络不好造成的错误try:# 写入文件with open(path + "2.jpg", "wb") as f:r = requests.get(imgurl)f.write(r.content)print("%s下载成功" % path)j += 1if j >= int(max_num):breakexcept Exception as e:print(e)# 当发生异常时,直接跳过continueprint("第{}页下载结束!".format(self.page))# 通过pn参数实现翻页,第一页为0,,间隔为20
for i in range(0, 30, 10):url = "https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word={0}&pn={1}&gsm=50&ct=&ic=0&lm=-1&width=0&height=0".format(word, i)Run = PaChong(word, i)Run.requests_get(url)Run.get_imgurl()Run.download()

这里我从百度上爬取了黄渤和孙红雷的各25张图片(只是训练一个小demo),效果图如下。为了方便以后的训练过程,将文件夹的名称改为“01”和“02”,作为相应类别的标签。

2.2训练数据

首先从OpenCV官网下载对应版本的Sources,data文件夹中有是特征文件,我们一般选用haarcascade_frontalface_default.xml。


我们要创建一个cv2.CascadeClassifier对象,该对象可以用来检测人脸。代码如下:

face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

下面是训练的代码:

import cv2
import os
import numpy
from imutils import paths
import randomroot_path = "./xqImg"def getFacesAndLabels():"""读取图片特征和标签"""global root_pathfaces = []lables = []# 获取人脸检测器face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 获取图片路径imagePaths = sorted(list(paths.list_images(root_path)))print(imagePaths)for path in imagePaths:#修改文件路径,防止在读取文件时cv2报错path = path.replace('\\','/')# 读取图片im = cv2.imread(path)# 转换灰度grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)# 读取人脸数据,获得人脸的位置信息face = face_detector.detectMultiScale(grey)for x, y, w, h in face:# 获得标签,文件夹的名称为类别(1和2)label = path.split("/")[-2]lables.append(int(label))# 图像分割获得人脸数据faces.append(grey[y:y+h, x:x+w])return faces, lables# 调用方法获取人脸信息及标签
faces, labels = getFacesAndLabels()
# 获取训练对象
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 训练数据
recognizer.train(faces, numpy.array(labels))
# 保存训练数据
recognizer.write('./trainer/trainer.yml')

2.3测试,绘制框和标签

利用训练好的文件trainer.yml进行人脸检测,通过predict函数返回人脸标签和置信度,

import cv2#对应的类别标签
Name ={'1':'huang','2':'sun'}# 加载训练数据集
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('./trainer/trainer.yml')# 准备识别的图片
im = cv2.imread('32.jpg')
grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)# 检测人脸
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face = face_detector.detectMultiScale(grey)for x, y, w, h in face:# 返回人脸标签和可信度,可信度数值越低,可信度越高(用词不当,不要在意)label, confidence = recognizer.predict(grey[y:y+h, x:x+w])
# 这里将60作为界限,当检测检测值为60时,我们就确定人物if confidence <= 60:# 绘制预测框cv2.rectangle(im, (x, y), (x + w, y + h), (255, 255, 0), 2)Label = Name[str(label)]# 显示标签cv2.putText(im,Label,(x, y),cv2.FONT_HERSHEY_COMPLEX, 0.7, (0, 255, 225), 2)else:print("未匹配到数据")cv2.imshow('im', im)cv2.waitKey(0)
# 销毁窗口
cv2.destroyAllWindows()



大功告成!!!!

3、总结

face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# face为脸部位置信息(用于绘制预测框)
face = face_detector.detectMultiScale(grey)
recognizer = cv2.face.LBPHFaceRecognizer_create()

以上三行代码获取人脸检测器对象,可以用来检测人脸

#训练
recognizer.train(faces, numpy.array(labels))
 #测试,返回人脸标签和可信度label, confidence = recognizer.predict(grey[y:y+h, x:x+w])

4、参考

https://blog.csdn.net/ZackSock/article/details/103889360

【OpenCV实战】OpenCV实现人脸检测详解(含代码)相关推荐

  1. OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)

    OpenCV-Python实战(14)--人脸检测详解(仅需6行代码学会4种人脸检测方法) 0. 前言 1. 人脸处理简介 2. 安装人脸处理相关库 2.1 安装 dlib 2.2 安装 face_r ...

  2. Java版人脸检测详解下篇:开发java应用并做成docker镜像

    本篇概览 如果您看过<Java版人脸检测上篇>一文,甚至动手实际操作过,那么你应该会对背后的技术细节感兴趣,开发这样一个应用,咱们总共要做以下三件事: 1.准备好docker基础镜像 2. ...

  3. Java版人脸检测详解下篇:编码

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 如果您看过<三分钟极速体验:Java版 ...

  4. Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 如果您看过<三分钟极速体验:Java版 ...

  5. 干货 | OpenCV中KLT光流跟踪原理详解与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 稀疏光流跟踪(KLT)详解 在视频移动 ...

  6. OpenCV标准霍夫直线检测详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...

  7. Viola-Jones人脸检测详解

    在人脸检测中,Viola-Jones算法是一种非常经典的算法,该算法在2001年的CVPR上提出,因其高效快速的检测而被广泛使用. 这个算法用来检测正面的人脸图像,对于侧脸图像的检测不是很稳健. 算法 ...

  8. 人脸算法系列:MTCNN人脸检测详解

    点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 大家好,从今天起我要开始更新人脸识别系列的文章了.为了提升 ...

  9. python实现自动答题详解含代码

    预备软件(这几个都百度一下,攻略多,不难): 1.intellij idea下载 2.python下载 3.requests.AIP .PIL安装 4.adb下载(用于手机截图) https://ww ...

最新文章

  1. 百度测试linux面试题,百度测试开发岗位面试题目
  2. LetCode 3 无重复字符的最大子串
  3. oracle 202,Oracle Certification 1Z0-202题库
  4. 求n个数中的最大或最小k个数
  5. springboot支持三种嵌入式servlet容器:tomcat(默认),jetty,undertow
  6. 谷歌新语言重写android,谷歌将推新设计语言 安卓APP用户界面将换新颜
  7. html css animation,css animation是什么?
  8. 交换两个整型变量的数值
  9. play @Before 的使用
  10. 14-磁盘管理-df,du命令,磁盘分区
  11. MSAgent 详细解说(上)
  12. KD树(网易游戏笔试)
  13. 收藏+下载!Flink 社区 2021 最新最全学习渠道汇总
  14. pandas处理df函数及plt绘图函数(作业总结笔记待补充...)
  15. android解压rar方法,Android以编程方式解压缩RAR文件
  16. 学习编程,既要仰望星空,又要脚踏实地
  17. xps转jpeg图片
  18. Filling the Gaps: Multivariate Time Series Imputation by Graph Neural Networks
  19. 周志华----机器学习2
  20. 蓝桥杯 调和级数 Java

热门文章

  1. 无网卡驱动,电脑可以用Usb线联网
  2. 西电 计算机学院 博后流动站,西电7个博士后科研流动站接受专家组综合评估检查...
  3. 浏览器跳出HTML编码,浏览器如何解析HTML字符编码
  4. 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染
  5. java计算机毕业设计小区物业管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  6. 【Ubuntu】Ubuntu16.04 安装显卡驱动重启黑屏问题处理
  7. 在windows 10下编译可在windows xp下使用的 opencv 3.2
  8. 软件工程学科对人类社会和生活的重要意义_2019-2020全国软件工程专业大学排名,高考生志愿填报看过来...
  9. Java中的for循环
  10. 端点科技春招笔试回忆(Java方向)