造轮子之DIY静态图像人脸检测|项目复盘

136 阅读3分钟

作者:看那个码农

公众号:看那个码农

1.项目简介

在Opencv3的源代码的文件夹中有一个名为haarcascade的文件夹,该文件夹就包括了Opencv用于人脸检测的XML文件,我们可以调用这些文件用于检测静止图像、视频、摄像头中的人脸。

当然在Python的opencv库中也同样存在这样的一个文件夹,

我们可以用来实现检测静止图像、视频、摄像头中的人脸。

这个文件在python库的Lib->site-package->cv2->data文件夹中

image.png

从文件名可知,我们可以使用这些xml文件用于人脸、眼镜、鼻子、嘴巴的追踪与检测

下面我们就来复盘如何利用Python的Opencv实现静态图像人脸检测的demo

2.项目配置

  • Python3.x
  • Opencv库
若没有Opencv库,可以通过
pip install opencv-python
指令安装

3.项目流程

整个demo的流程是首先载入图像,加载图像,检查到人脸后,在图片上画出矩形框,最后输出保存。

1.导入opencv库

import cv2

2.导入文件名

filename = 'E:\\demo\\detect\\source.jpg'

注意此处用的是绝对路径”\\”

3.定义detect函数

detect函数是本文所用到的唯一一个函数,用于人脸检测。

函数声明了face_cascade变量,该变量为CascadeClassifier对象

负责进行人脸检测

face_cascade=cv2.CascadeClassifier('D:\\software\\Anaconda\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')

注意此处也需要用绝对路径“\\”

4.图像转换

加载图像后,将图像转换为灰度图像,因为人脸检测需要灰度图像的色彩空间

img=cv2.imread(filename)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

5.接下来是进行实际的人脸检测

faces=face_cascade.detectMultiScale(gray,1.3,5)

传递的参数是scaleFactor和minNeighbors,

它们分别表示人脸检测过程中每次迭代时图像的压缩率以及每个人脸矩形保留近邻数目的最小值

检测操作的返回值是人脸矩阵数组,

函数允许通过坐标来绘制矩形(x和y表示左上角的坐标,w和h表示人脸矩形的宽度和高度)

6.依次提取faces变量中的值来找到人脸,并在人脸周围绘制蓝色矩形框

for (x,y,w,h) in faces:
    img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

7.创建namedWindow,显示处理后的图像

cv2.namedWindow("看那个码农-静态图像检测")
cv2.imshow('看那个码农-静态图像检测',img)

同时为了避免图像窗口自动关闭,需要加入waitKey函数,这样子按下任意键都可以关闭窗口

cv2.waitKey(0)

8.存储输出图像

cv2.imwrite('E:\\demo\\detect\\end.jpg',img)

注意是用的绝对路径

4.项目完整代码

import cv2

def detect(filename):
    face_cascade=cv2.CascadeClassifier('D:\\software\\Anaconda\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')

    img=cv2.imread(filename)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    faces=face_cascade.detectMultiScale(gray,1.3,5)

    for (x,y,w,h) in faces:
        img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    cv2.namedWindow("看那个码农-静态图像检测")
    cv2.imshow('看那个码农-静态图像检测',img)
    cv2.imwrite('E:\\demo\\detect\\end.jpg',img)
    cv2.waitKey(0)

filename = 'E:\\demo\\detect\\source.jpg'
detect(filename)

5.项目结果

原图

1.jpg

检测后

image.png

6.项目思考总结

该项目有一处十分重要的点,就是我导入文件时,多次强调需要使用绝对路径“\\”

不然文件无法正常导入进去。

第二点,本项目用于进行人脸检测的级联分类器haarcascade_frontalface_default.xml

是Opencv官方预训练好了,我们可以直接调用,平时做做小demo还可以,但是如果想要实际应用到自己实际的项目的话,最好利用自己项目的数据重新训练,或者说基于卷积神经网络,利用深度学习的方式进行人脸检测,保证训练模型与项目的可适配度。

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情