【OpenCV-Python】18 使用OpenCV进行人脸检测

在静态图像或视频中检测人脸的操作十分相似。视频人脸检测只是从摄像头读出每帧图像,然后采用静态图像中人脸检测方法进行检测。视频中人脸检测还涉及到其他概念,例如跟踪,而静态图像中的人脸识别就没有这样的概念,但它们的基本理论一致。

静态图像的人脸检测

人脸检测首先是加载图像并检测人脸,这也是最基本的一步。为了使所得到的结果有意义,可在原始图像的人脸周围绘制矩阵框。

其中项目中cascades/haarcascades文件夹包含了所有OpenCV的人脸识别的XML文件,用于检测静止文件、视频、摄像头所得到图像中的人脸。

树状图

.
├── image_detection.py         		
├── video_detection.py   		
├── images
│     └──people.jpg
└──cascades
     ├── haarcascade_frontalface_default.xml      			       
     └── haarcascade_eye.xml       

代码

# -*- coding: utf-8 -*-
"""
Created on Fri Jan  1 21:07:47 2021

@author: gkm0120
"""
# image_detection.py 
import cv2

filename = 'D:/Python/Test_code/pycv/images/people.jpg'

def detect(filename):
  face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
  eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
  img = cv2.imread(filename)
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  # face_cascade.detectMultiScale(image,scaleFactor,minNeighbor)
  # 参数2是人脸检测过程中每次迭代图像的压缩率,参数3是每个人脸矩形保留近邻数目的最小值
  faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  for (x,y,w,h) in faces:
  	# cv2.rectangle允许通过坐标来绘制矩形(x和y表示左上角的坐标,w和h表示人脸矩形的宽度和高度)
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
  # 创建namedWindow的实例,并显示处理后的图像
  cv2.namedWindow('Face Detection!!')
  cv2.imshow('Face Detection!!', img)
  cv2.imwrite('./face_detection.jpg', img)
  cv2.waitKey(0)

detect(filename)

图例

people.jpg
face_detection.jpg

视频中的人脸检测

在视频的帧上重复静态人脸检测的过程就能完成视频(如摄像头的输入或视频文件)中的人脸检测。

以下代码主要是:打开摄像头,读取帧,检测帧中的人脸,扫描检测到的人脸的眼睛,对人脸绘制蓝色的矩形框,对眼睛绘制绿色的矩形框。

代码

# -*- coding: utf-8 -*-
"""
Created on Sat Jan  2 10:59:15 2021

@author: gkm0120
"""
# video_detection.py
import cv2

def detect():
  face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
  eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
  camera = cv2.VideoCapture(0)# 初始化摄像头,0表示使用第一个摄像头
  # 捕获帧,转换为灰度图像。read()函数返回两个值:布尔值(表示是否成功读取帧)、帧本身。
  while (True):
    ret, frame = camera.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    #img = cv2.imread(frame)
    for (x,y,w,h) in faces:
        img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
        
        roi_gray = gray[y:y+h, x:x+w]
        # 限制对眼睛搜索的最小尺寸为40*40像素,可去掉所有假阳性。然后调试参数(特征的最大尺寸、比例因子、近邻的数量),达到预期。
        eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40,40))
        # 循环输出检测眼睛的结果,并绘制绿色的矩形框
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(img,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(0,255,0),2)
	
    cv2.imshow("camera", frame)
    if cv2.waitKey(1000 // 12) & 0xff == ord("q"):
      break

  camera.release()
  cv2.destroyAllWindows()

if __name__ == "__main__":
  detect()

图例

在这里插入图片描述

注:在眼睛检测中还有另外几个参数。detectMultiscale()函数有许多可选参数:在人脸检测中。默认选项足以检测人脸。但是眼睛是一个比较小的人脸特征,并且胡子或鼻子的本身阴影(self-casting shadow)以及帧的随机阴影都会产生假阳性(false positive)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值