第一章 python-opencv-图片导入和显示
第二章 python-opencv图像简单处理
第三章 python-opencv图像mask掩膜处理
第四章 python-opencv图像马赛克
第五章 python-opencv人脸马赛克
本文主要介绍如何使用opencv加载级联器检测图像中的人脸,并将人脸用方框标注出来。
本文将代码进行详细的标注说明。
import cv2
import numpy as np
if __name__ == '__main__':
img = cv2.imread('./tong.jpg')
#加载人脸检测模型
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
#检测出的人脸坐标 x,y,w,h
# faces = face_detector.detectMultiScale(img)
#调参增加检测精度
faces = face_detector.detectMultiScale(img,
scaleFactor=1.05, #缩放每次检测范围,默认1.1
minNeighbors=3)
# print(faces)
#绘制矩形检测框
for x,y,w,h in faces: # for循环可以进行数组遍历
cv2.rectangle(img,
pt1=(x,y),
pt2=(x+w,y+h),
color=[0,0,255],
thickness=2) #在检测到的人脸区域绘制矩形框
#绘制圆形检测框
# for x,y,w,h in faces:
# cv2.circle(img,
# center=(x+w//2, y+h//2),
# radius=w//2, #半径
# color=[0,255,0],
# thickness=2)
cv2.imshow('face', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
人脸检测模型可以直接从opencv官方网站中下载(下载地址),下载后是一个xml文件,通过加载xml文件即可进行检测。
模型加载用到的函数为cv2.CascadeClassifier(),其中括号中直接填入你下载好的检测模型的路径。
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
模型加载后便开始人脸检测,人脸检测用到的是detectMultiScale函数。
detectMultiScale函数可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)
detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
各参数含义为:
image--待检测图片,一般为灰度图像加快检测速度;
objects--被检测物体的矩形框向量组;
scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;
flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为
CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,
因此这些区域通常不会是人脸所在区域;
minSize和maxSize用来限制得到的目标区域的范围。
检测代码:
faces = face_detector.detectMultiScale(img,
scaleFactor=1.05, #缩放每次检测范围,默认1.1
minNeighbors=3)
人脸测结果输出的是人脸区域相对于图像的左上角坐标(x,y)和宽度w、高度h,可以根据这些信息绘制标注框。
for x,y,w,h in faces: # for循环可以进行数组遍历
cv2.rectangle(img,
pt1=(x,y),
pt2=(x+w,y+h),
color=[0,0,255],
thickness=2) #在检测到的人脸区域绘制矩形框
用for循环遍历所有检测到的人脸信息,然后从左上角(x,y)到右下角(x+w,y+h)绘制矩形框,颜色[0,0,255]表示红色,thickness=2未标注框线的粗细程度。