Python中使用opencv-python进行人脸检测
之前写过一篇VC++中使用OpenCV进行人脸检测的博客。以数字图像处理中经常使用的lena
图像为例,如下图所示:
使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序,
objectDetection.py
代码如下:
from __future__ import print_function | |
import cv2 as cv | |
import argparse | |
def 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_cascade | |
eyes_cascade_name = args.eyes_cascade | |
face_cascade = cv.CascadeClassifier() | |
eyes_cascade = cv.CascadeClassifier() | |
#-- 1. Load the cascades | |
if 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 stream | |
cap = 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 文件,这些可用于检测静止图像、视频和摄像头所得到图像中的人脸。如下图所示:
- 人脸检测器(默认):haarcascade_frontalface_default.xml
- 人脸检测器(快速 Harr):haarcascade_frontalface_alt2.xml
- 人脸检测器(侧视):haarcascade_profileface.xml
- 眼部检测器(左眼):haarcascade_lefteye_2splits.xml
- 眼部检测器(右眼):haarcascade_righteye_2splits.xml
- 身体检测器:haarcascade_fullbody.xml
- 上半身检测器:haarcascade_upperbody.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 cv2 | |
faceCascade = 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_function | |
import cv2 as cv | |
import argparse | |
def 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 cascades | |
if 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 stream | |
cap = 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配置文件,对采集到的每一帧图像进行人脸和眼睛的检测,并做椭圆标记,如下图所示: