Python中使用opencv-python进行人脸检测

Python中使用opencv-python进行人脸检测

之前写过一篇VC++中使用OpenCV进行人脸检测的博客。以数字图像处理中经常使用的lena图像为例,如下图所示:

使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序,

objectDetection.py代码如下:

python 复制代码
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库进行人脸检测示例代码

示例代码如下所示:

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修改后的示例代码如下:

python 复制代码
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配置文件,对采集到的每一帧图像进行人脸和眼睛的检测,并做椭圆标记,如下图所示:

参考资料

相关推荐
shansjqun几秒前
教学内容全覆盖:航拍杂草检测与分类
人工智能·分类·数据挖掘
狸克先生3 分钟前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互
baiduopenmap17 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
小任同学Alex20 分钟前
浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)
人工智能·自然语言处理·大模型
新加坡内哥谈技术27 分钟前
微软 Ignite 2024 大会
人工智能
nuclear201139 分钟前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
江瀚视野1 小时前
Q3净利增长超预期,文心大模型调用量大增,百度未来如何分析?
人工智能
Lucky小小吴1 小时前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
陪学1 小时前
百度遭初创企业指控抄袭,维权还是碰瓷?
人工智能·百度·面试·职场和发展·产品运营
QCN_1 小时前
湘潭大学人工智能考试复习1(软件工程)
人工智能