1. 前言
之前其实写过这样一个博客,当然那篇博客也是我的第一篇博客,传送门:https://blog.csdn.net/weixin_44936889/article/details/99685238
现在回头看发现代码和文章风格并不是很好,代码也有一些小问题,这里就重新整理一下并做出一些改进,实现一个更好的效果,这一期的代码补充了许多注释,检测效果如图:
(这就是我!!!哈哈哈)
2. 前期准备
2.1 安装依赖库
库名称 | 作用及版本号 |
---|---|
opencv-python | 包括图像视频处理,以及人脸识别模型(3.4.2) |
numpy | 主要用于矩阵运算(1.16.3) |
tensorflow | 机器学习框架,用于训练关键点检测模型(1.14.0) |
matplotlib | 用于绘制Loss曲线等(3.0.3) |
pandas | 用于读取并解析csv文件(0.24.2) |
下载方法是在终端输入:
pip install 库名称==版本号 --user
如:
pip install numpy==1.16.3 --user
版本号不一定需要这么严格安装这个来,但如果版本号差太远的话可能会报错AttributeError: module ‘xxxx’ has no attribute ‘xxxxx’
2.2 下载人脸关键点数据集
数据集主要使用了kaggle上Facial Keypoints Detection比赛提供的数据集。
网址: https://www.kaggle.com/c/facial-keypoints-detection
该数据集包含包括7,049幅图像,96 x 96像素的灰度图像。预测15个人脸关键点。数据集中每一张图片刚好包含整个人脸,需要检测的15个人脸关键点如下图所示:
3. 人脸检测程序
import cv2
def ad_threshold(img):
th2 = cv2.adaptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 19, 4) # 自适应二值化
return th2
def CatchUsbVideo(window_name, camera_index):
# 定义主函数
cv2.namedWindow(window_name) # 创建摄像头窗口
cap = cv2.VideoCapture(camera_index) # 调用摄像头(一般电脑自带摄像头index为0)
# 调用分类(人脸识别分类器是cv一个预训练的模型,文件名为haarcascade_frontalface_alt2.xml)
# 在我的电脑里查找就可以找到,找到后复制到当前文件夹内
# 我的电脑的储存路径是C:\Users\dell\AppData\Roaming\Python\Python37\site-packages\cv2\data
classfier = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
# 设置边框颜色(用于框出人脸)
color = (0, 255, 0)
font = cv2.FONT_HERSHEY_SIMPLEX # 创建摄像头前置的文字框
while cap.isOpened():
catch, frame = cap.read() # 读取每一帧图片
if not catch:
raise Exception('Check if the camera if on.')
break
# 转换为灰度图片
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = ad_threshold(gray) # 自适应二值化处理
# scaleFactor 为图片缩放比例
# minNeighbors 是至少检查为3次是人脸才作为标记,适当增大可以有效抗干扰
# minSize 是检测的最小人脸的大小
faceRects = classfier.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0:
# 历遍每次检测的所有脸
for face in faceRects:
x, y, w, h = face # face是一个元祖,返回了分类器的检测结果,包括起始点的坐标和高度宽度
image = frame[y-10:y+h+10, x-10:x+w+10] # 对原图片进行裁剪
cv2.rectangle(frame, (x-5, y-5), (x+w+5, y+h+5), color, 2) # 绘制人脸检测的线框
cv2.putText(frame, 'face',(x + 30, y + 30), font, 1, (255, 0, 255), 4)
cv2.imshow(window_name, frame) # 显示人脸检测结果
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
# 按q退出
break
if cv2.getWindowProperty(window_name, cv2.WND_PROP_AUTOSIZE) < 1:
# 点x退出
break
# 释放摄像头
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
CatchUsbVideo("face_detect", camera_index=0)
# camera_index 是摄像头的编号,其中笔记本前置摄像头编号为0
3.1 人脸检测器
人脸检测是opencv已经自带的功能,我们需要在我们的电脑中搜索到haarcascade_frontalface_alt2.xml 这个文件:
找到之后把它跟我们的源码放在同一个文件夹下:
3.2 测试代码
运行之后就是这样啦~
4. 进度
- 前期准备
- 人脸检测
- 训练关键点检测模型
- 实现关键点检测
下一篇:
手把手教学之——人脸识别与关键点检测(二)搭建和训练模型
对你有帮助的话,记得点赞关注一下哦