Python中使用opencv-python进行人脸检测
之前写过一篇VC++中使用OpenCV进行人脸检测的博客。以数字图像处理中经常使用的lena
图像为例,如下图所示:
使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序,objectDetection.py
代码如下:
from __future__ import print_functionimport cv2 as cvimport argparsedef detectAndDisplay(frame): frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) frame_gray = cv.equalizeHist(frame_gray) #-- Detect faces faces = face_cascade.detectMultiScale(frame_gray) for (x,y,w,h) in faces: center = (x + w//2, y + h//2) frame = cv.ellipse(frame, center, (w//2, h//2), 0, 0, 360, (255, 0, 255), 4) faceROI = frame_gray[y:y+h,x:x+w] #-- In each face, detect eyes eyes = eyes_cascade.detectMultiScale(faceROI) for (x2,y2,w2,h2) in eyes: eye_center = (x + x2 + w2//2, y + y2 + h2//2) radius = int(round((w2 + h2)*0.25)) frame = cv.circle(frame, eye_center, radius, (255, 0, 0 ), 4) cv.imshow('Capture - Face detection', frame)parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.')parser.add_argument('--face_cascade', help='Path to face cascade.', default='data/haarcascades/haarcascade_frontalface_alt.xml')parser.add_argument('--eyes_cascade', help='Path to eyes cascade.', default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')parser.add_argument('--camera', help='Camera divide number.', type=int, default=0)args = parser.parse_args()face_cascade_name = args.face_cascadeeyes_cascade_name = args.eyes_cascadeface_cascade = cv.CascadeClassifier()eyes_cascade = cv.CascadeClassifier()#-- 1. Load the cascadesif not face_cascade.load(cv.samples.findFile(face_cascade_name)): print('--(!)Error loading face cascade') exit(0)if not eyes_cascade.load(cv.samples.findFile(eyes_cascade_name)): print('--(!)Error loading eyes cascade') exit(0)camera_device = args.camera#-- 2. Read the video streamcap = cv.VideoCapture(camera_device)if not cap.isOpened: print('--(!)Error opening video capture') exit(0)while True: ret, frame = cap.read() if frame is None: print('--(!) No captured frame -- Break!') break detectAndDisplay(frame) if cv.waitKey(10) == 27: break
所在目录为D:\env_build\opencv4.9.0\opencv\sources\samples\python\tutorial_code\objectDetection\cascade_classifier\objectDetection.py
人脸识别的背景
人脸识别可以用在身份认证,门禁等场合中,可以通过训练大量的人脸数据获取人脸的特征。但是实际场景可以比较复杂,由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,图像细节变得不稳定;还有戴了口罩、帽子之后对于人脸的检测就变得更麻烦了。Haar 特征是一种用于实现实时人脸跟踪的特征。每一个 Haar 特征都描述了相邻图像区域的对比模式。例如,边,顶点和细线都能生成具有判别性的特征。
haar级联数据获取
在 sources 的一个文件夹 data/haarcascades。该文件夹包含了所有 OpenCV 的人脸检测的 XML 文件,这些可用于检测静止图像、视频和摄像头所得到图像中的人脸。如下图所示:
其中,本文中我们使用默认的人脸检测器xml配置文件
haarcascade_frontalface_default.xml
,可以从https://github.com/murtazahassan/Learn-OpenCV-in-3-hours/blob/master/Resources/haarcascade_frontalface_default.xml处下载 资源图片地址
人脸资源图片地址为:https://github.com/murtazahassan/Learn-OpenCV-in-3-hours/blob/master/Resources/lena.png
Python中使用opencv-python库进行人脸检测示例代码
示例代码如下所示:
import cv2faceCascade = cv2.CascadeClassifier("Resources/haarcascade_frontalface_default.xml")img = cv2.imread("Resources/lena.png")imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(imgGray, 1.1, 4)for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)cv2.imshow("Result", img)cv2.waitKey(0)
运行结果如下图所示:
使用OpenCV官方的python人脸检测示例代码进行实时人脸和眼睛检测
opencv4.9.0\opencv\sources\samples\python\tutorial_code\objectDetection\cascade_classifier\objectDetection.py
修改后的示例代码如下:
from __future__ import print_functionimport cv2 as cvimport argparsedef detectAndDisplay(frame): frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) frame_gray = cv.equalizeHist(frame_gray) #-- Detect faces faces = face_cascade.detectMultiScale(frame_gray) for (x,y,w,h) in faces: center = (x + w//2, y + h//2) frame = cv.ellipse(frame, center, (w//2, h//2), 0, 0, 360, (255, 0, 255), 4) faceROI = frame_gray[y:y+h,x:x+w] #-- In each face, detect eyes eyes = eyes_cascade.detectMultiScale(faceROI) for (x2,y2,w2,h2) in eyes: eye_center = (x + x2 + w2//2, y + y2 + h2//2) radius = int(round((w2 + h2)*0.25)) frame = cv.circle(frame, eye_center, radius, (255, 0, 0 ), 4) cv.imshow('Capture - Face detection', frame)face_cascade_name = "data/haarcascades/haarcascade_frontalface_alt.xml"eyes_cascade_name = "data/haarcascades/haarcascade_eye_tree_eyeglasses.xml"face_cascade = cv.CascadeClassifier()eyes_cascade = cv.CascadeClassifier()#-- 1. Load the cascadesif not face_cascade.load(cv.samples.findFile(face_cascade_name)): print('--(!)Error loading face cascade') exit(0)if not eyes_cascade.load(cv.samples.findFile(eyes_cascade_name)): print('--(!)Error loading eyes cascade') exit(0)camera_device = 0#-- 2. Read the video streamcap = cv.VideoCapture(camera_device)if not cap.isOpened: print('--(!)Error opening video capture') exit(0)while True: ret, frame = cap.read() if frame is None: print('--(!) No captured frame -- Break!') break detectAndDisplay(frame) if cv.waitKey(10) == 27: break
上述代码从摄像头实时采集数据,使用haar级联人脸正面和眼睛的训练测试结果xml配置文件,对采集到的每一帧图像进行人脸和眼睛的检测,并做椭圆标记,如下图所示: