从零开始实现python人脸识别(三) 图片人脸检测

现在, 我们终于可以开始进行人脸识别的学习了, 首先我们来学习 "人脸检测"

0. 人脸检测和人脸识别有什么区别?

我们可以这样简单的区分:

  • 人脸检测是从图片或视频中检测到人脸,
  • 人脸识别是从图片或视频中检测到人脸, 并认出他是谁

image-20220221142836354

1. 找到分类器

什么是分类器?? 过滤器就是从图片上过滤关键信息的工具

比如我们要识别人脸 我们需要一个分类器, 用这些分类器我们就能从图片中过滤出人脸

openCV自带了很多分类器, 我们可以轻松找到他们

寻找方法:

找到我们在第一课安装的 找到openCV库安装位置 一节中提到的方法找到安装位置, 在cv2文件夹中找data文件夹, 这里面都是人脸/人体相关的分类器, 用这些分类器就能过滤出符合条件的人脸, 我们将适合的分类器复制到我们自己的文件夹中使用即可, 例如我们本次用的: haarcascade_frontalface_alt2.xml

2. 识别人脸

# 打开图片
img = cv2.imread("img/james.png")
# 转为灰度图片
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载人脸识别分类器
face_detection = cv2.CascadeClassifier(r"haarcascade_frontalface_alt2.xml")
# 监测人脸
face = face_detection.detectMultiScale(gray_img)
# 打印结果
print(face)

运行结果:

我们可以用矩形画图把它画出来(可以画原图, 也可以画灰度图)

import cv2

# 打开图片
img = cv2.imread("img/james.png")
# 转为灰度图片
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载人脸识别过滤器
face_detection = cv2.CascadeClassifier(r"haarcascade_frontalface_alt2.xml")
# 监测人脸
face = face_detection.detectMultiScale(gray_img)
# 打印结果
print(face)
# 绘制矩形
for x, y, w, h in face:
    cv2.rectangle(img, (x, y, x+w, y+h), color=(0, 0, 255), thickness=3)
# 显示图片
cv2.imshow("img_title", img)
cv2.waitKey(0)

image-20220221135330542

3. 关于detectMultiScale (了解)

detectMultiScale 检测不同大小的对象,并返回矩形的列表

此方法的任务是检测不同大小的对象,并返回矩形的列表, 被检测的图片,需要转换为灰度图

detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]]) -> objects

参数1:image--待检测图片,一般为灰度图像加快检测速度;

参数2:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1(即每次搜索窗口依次扩大10%);
参数3:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。

参数4:lags--使用默认值 不用管
参数5、6:minSize和maxSize用来限制得到的目标区域的范围。

想弄清楚每个参数的作用, 请参考这篇文章: https://blog.csdn.net/leaf_zizi/article/details/107637433

4. 监测多张人脸

我们以这张图为例:

dengchao

我们可以直接用刚刚的程序, 如果识别有错误或者识别不全, 则需要调整detectMultiScale参数, 或者使用其他的分类器

import cv2

# 打开图片
img = cv2.imread("img/dengchao.png")
# 转为灰度图片
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载人脸识别过滤器
face_detection = cv2.CascadeClassifier(r"haarcascade_frontalface_alt2.xml")
# 监测人脸
face = face_detection.detectMultiScale(
    gray_img, 1.04, 3, 0, (50, 50), (300, 300))
# 打印结果
print(face)
# 绘制矩形
for x, y, w, h in face:
    cv2.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=3)
# 显示图片
cv2.imshow("img_title", img)
cv2.waitKey(0)

image-20220221142836354

有时识别效果不是很满意是很正常的, 调整参数和分类器是个技术活, 此外, 由于算法能力的限制, 是不可能永远100%识别正确的, 大家慢慢学习

五. 封装成函数

import cv2

def face_detect(img):
    # 转为灰度图片
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 加载人脸识别过滤器
    face_detection = cv2.CascadeClassifier(r"haarcascade_frontalface_alt2.xml")
    # 监测人脸
    face = face_detection.detectMultiScale(
        gray_img, 1.1, 3, 0, (50, 50), (300, 300))
    # 绘制矩形
    for x, y, w, h in face:
        cv2.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=3)
    # 显示图片
    cv2.imshow("img_title", img)

# 打开图片
img = cv2.imread("img/dengchao.png")
# 人脸检测
face_detect(img)

cv2.waitKey(0)
©本文首发于 菁英编程爱好者, 转载请注明出处.
菁英编程爱好者 » 从零开始实现python人脸识别(三) 图片人脸检测

发表评论

提供最优质的资源集合

立即查看 了解详情