目录
1.理论知识
1)安装opencv
2)opencv人脸检测器
3) 加载人脸分类器
2.代码介绍
1)用摄影头调用图像
2)选择图片
3.完整代码
本文实现人脸目标检测的方法是opencv图像采集,因此我们也需先下载opencv的相关库
方法:pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com/pypi/simple
opencv中自带人脸检测器,是使用Haar算法进行人脸检测。大致介绍一下其原理,先生成一个矩形块,根据人脸的各个部位的明暗度,并要求眼睛、鼻梁、嘴等部位超过一定的阈值(PS中的知识)从而实现人脸检测,大致看图就清晰易懂。
# 创建一个级联分类器
haarcascade = cv2.CascadeClassifier('D:\\2\\haarcascade_frontalface_alt.xml')
但这个人脸分类器我试过只能达到正脸的效果,侧脸并不能进行检测出是人的效果
Haar的下载地址:https://github.com/opencv/opencv/tree/master/data
# 调用摄像头进行拍照
cap = cv2.VideoCapture(0)
ret, img = cap.read()
cap.release()
本文运用图片进行目标检测
# 括号中的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)
结果显示(含侧脸检测失败图):
import cv2
if __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)