当前位置:首页 » 《随便一记》 » 正文

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

27 人参与  2024年02月28日 16:46  分类 : 《随便一记》  评论

点击全文阅读


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

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

使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序,
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 文件,这些可用于检测静止图像、视频和摄像头所得到图像中的人脸。如下图所示:
haar级联数据

人脸检测器(默认):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 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配置文件,对采集到的每一帧图像进行人脸和眼睛的检测,并做椭圆标记,如下图所示:
实时人脸和眼睛检测

参考资料

人脸识别-Haar级联人脸识别-多张人脸检测LEARN OPENCV in 3 HOURS with Python | Including 3xProjects | Computer VisionLearn-OpenCV-in-3-hoursLEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Visionmurtazahassan/Learn-OpenCV-cpp-in-4-HoursOpenCV官网OpenCV-Get StartedOpenCV Github仓库源代码OpenCV tutorial

点击全文阅读


本文链接:http://zhangshiyu.com/post/71059.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1