在成功安装python的opencv包后,利用opencv自带的识别文件,只需要几条简单语句即可实现人脸框取的功能(自己备忘,后面有机会可以直接拿来参考):
import cv2
def faceDetector(window_name, camera_id):
#视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
cap = cv2.VideoCapture(camera_id)
#使用OpenCV自带人脸识别分类器,默认在Pyhon的安装目录下
classfier = cv2.CascadeClassifier("D:\\InstallSoftware\\Python\\Python38\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_alt2.xml")
#识别出人脸后要画的边框的颜色,RGB格式
color = (0, 255, 0)
while cap.isOpened():
#每次读取一帧摄像头或者视频数据
ret, frame = cap.read()
if not ret:
break
#调整帧的大小
#定义摄像头采集的图像比例系数
scaling_factor = 0.5
frame = cv2.resize(frame,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_AREA)
#将当前帧转换成灰度图像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#人脸检测1.3和4分别为每次图片缩放比例和需要检测的有效点数
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.1,minNeighbors=4,minSize=(32,32))
#大于0则检测到人脸
if len(faceRects) > 0:
#在识别到的多个人脸中框出一张人脸
for faceRect in faceRects:
x, y, w, h = faceRect
cv2.rectangle(frame,(x,y),(x+w,y+h),color,2)
#将一帧图像显示出来
cv2.imshow(window_name, frame)
#每次等待1ms 当esc按键被按下时退出显示
#ESC按键对应的键值为27
if (cv2.waitKey(1) & 0xff) == 27:
break
#释放视频采集对象
cap.release()
#关闭所以的活动窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
faceDetector("Face Detector", 700)
以上代码并不复杂,主要备注一下detectMultiScale方法的参数:
detectMultiScale函数介绍:
参数1:image--待检测图片,一般为灰度图像加快检测速度;
参数2:objects--被检测物体的矩形框向量组;
参数3:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%(简单理解就是分类器每次在图片中识别完成后会将图片缩小一定比例,对应的人脸也会变小,再一次遍历识别进而增加识别到的几率);
参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上(简单理解为在图片同一区域内识别到人脸的次数大于等于设定值时,则判断为识别到了有效人脸);
参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;
参数6、7:minSize和maxSize用来限制得到的目标区域的范围(无需多言)。