当前位置: 代码迷 >> 综合 >> 用python-opencv实现简单的人脸检测(代码+理论知识)
  详细解决方案

用python-opencv实现简单的人脸检测(代码+理论知识)

热度:59   发布时间:2023-12-05 17:57:09.0

目录

1.理论知识

1)安装opencv

2)opencv人脸检测器

3) 加载人脸分类器

2.代码介绍

1)用摄影头调用图像

2)选择图片

 3.完整代码


1.理论知识

1)安装opencv

本文实现人脸目标检测的方法是opencv图像采集,因此我们也需先下载opencv的相关库

方法:pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com/pypi/simple

2)opencv人脸检测器

opencv中自带人脸检测器,是使用Haar算法进行人脸检测。大致介绍一下其原理,先生成一个矩形块,根据人脸的各个部位的明暗度,并要求眼睛、鼻梁、嘴等部位超过一定的阈值(PS中的知识)从而实现人脸检测,大致看图就清晰易懂。

3) 加载人脸分类器

# 创建一个级联分类器
haarcascade = cv2.CascadeClassifier('D:\\2\\haarcascade_frontalface_alt.xml')

但这个人脸分类器我试过只能达到正脸的效果,侧脸并不能进行检测出是人的效果

Haar的下载地址:https://github.com/opencv/opencv/tree/master/data

2.代码介绍

1)用摄影头调用图像

# 调用摄像头进行拍照
cap = cv2.VideoCapture(0)
ret, img = cap.read()
cap.release()

2)选择图片

本文运用图片进行目标检测

# 括号中的path为图像路径
img=cv2.imread(path)

检测图像中的人脸,返回人脸的相关向量组

faces = haarcascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

scaleFactor参数:指图像尺寸每次减小的比例为1.3

minNeighbors参数:指每一个目标至少被检测5次才算真正的目标(像素在计算机里就是一个个格子,不同大小的图像框都能检测到人脸)


绘制矩形框:

# 对检测到的目标画框
for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)

rectangle函数中参数的含义: 

img:处理的图像
(x,y),(x+w,y+h): 矩形框的左上和右下的坐标
(255,255,0): 颜色
1 : 线条的宽度

展示图像:

# 显示结果
cv2.imshow("Final_image", img)
cv2.waitKey(0)

结果显示(含侧脸检测失败图): 

 

 3.完整代码

import cv2if __name__=="__main__":img = cv2.imread("D:\\2\\code\\datas\\test1.jpg")# 读取照片后转换成灰度图gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)haarcascade = cv2.CascadeClassifier('D:\\2\\haarcascade_frontalface_alt.xml')# 识别图像中的人脸,返回所有人脸的矩形框向量组# scaleFactor 为了检测到不同大小的目标,通过scalefactor参数把图像长宽同时按照一定比例逐步缩小# 然后检测,这个参数设置的越大,计算速度越快,但可能会错过了某个大小的人脸。# minNeighbors 构成检测目标的相邻矩形的最小个数faces = haarcascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)# 对检测到的目标画框for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 0), 1)
"""
#在img上绘制矩形
def draw(img, faces, color):for x1, y1, x2, y2 in faces:cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)img1 = img.copy()
draw(img1, faces, (0, 255, 0))
"""
# 显示结果
cv2.imshow("Final_image", img)
cv2.waitKey(0)