OpenCV的应用:简单的人脸识别和检测

一.基础

人脸检测是计算机视觉领域的基础任务,核心目标是从图像或视频帧中自动定位并识别出人脸区域(通常用矩形边界框标记),不涉及身份识别,仅关注 "是否存在人脸" 及 "人脸在哪里"。其原理可分为传统方法现代深度学习方法两大体系,核心逻辑是 "特征提取 + 分类判断",但具体实现差异较大。

通用流程:从图像到人脸框的核心步骤

无论传统方法还是深度学习方法,人脸检测的基本流程可概括为以下四步:

  1. 图像预处理:统一输入格式(如灰度化、尺寸归一化),减少干扰信息(如降噪);
  2. 候选区域生成:通过滑动窗口、特征响应等方式,筛选出可能含有人脸的区域;
  3. 特征提取:从候选区域中提取能表征 "人脸" 的关键特征(如五官分布、边缘纹理等);
  4. 分类判断:通过分类器判断候选区域是否为人脸,最终输出所有为人脸的边界框。

二.实现

OpenCV中自带已训练好的检测器,包括面部、眼睛、猫脸等,都保存在xml文件中,通过以下方式找到他们

python 复制代码
import cv2 as cv
print(cv.__file__)

利用这些文件来识别人脸,眼睛等。检测流程如下:

1.读取图片,并转化成灰度图

2.实例化人脸和眼睛检测的分类器对象

#1实例化级联分类器

classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

#加载分类器

classifier.load("haarcascade_frontalface_default.xml")

3.进行人脸和眼睛的识别检测

rect = classifier.detectMultScale(gray,scaleFactor,minNeighbors,minSize,maxsize)

**gray:**要进行检测的人脸图片

**scaleFactor:**前后俩次扫描中,搜索窗口的比例系数

**minNeighbors:**目标被检测的次数才会被认为是检测的目标

**minSize,maxsize:**目标的最小尺寸和最大尺寸

4.将目标检测结果绘制出来

5.主程序

python 复制代码
import cv2 as cv
import matplotlib.pyplot as plt

# 1.以灰度图的形式读取图片
img = cv.imread("C:\\Users\\JWTV\\Desktop\\111.png")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2.实例化OpenCV人脸和眼睛识别的分类器
face_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
face_cas.load('E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
eyes_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")
eyes_cas.load("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml")

# 3.调用识别人脸
faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
for faceRect in faceRects:
    x, y, w, h = faceRect
    # 框出人脸
    cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
    # 4.在识别出的人脸中进行眼睛的检测
    roi_color = img[y:y + h, x:x + w]
    roi_gray = gray[y:y + h, x:x + w]
    eyes = eyes_cas.detectMultiScale(roi_gray)
    for (ex, ey, ew, eh) in eyes:
        cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

# 检测结果的绘制
plt.figure(figsize=(8, 6), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title('result')
plt.xticks([]), plt.yticks([])
plt.show()

6.在视频中也可以进行类似的操作

python 复制代码
import cv2 as cv
import matplotlib.pyplot as plt
# 1.读取视频
cap = cv.VideoCapture("C:\\Users\\JWTV\\Desktop\\111.png")
# 2.在每一帧数据中进行人脸识别
while(cap.isOpened()):
    ret,frame = cap.read( )
    if ret==True:
        gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
        # 3.实例化OpenCV人脸识别的分类器
        face_cas = cv.CascadeClassifier("E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")
        face_cas.load('E:\\py\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')
        #4.调用识别人脸
        faceRects =face_cas.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))
        for faceRect in faceRects:
            x,y,w,h = faceRect
        # 框出人脸
            cv.rectangle(frame,(x,y),(x + h,y + w) , (0,255,0),3)
        cv.imshow("frame",frame)
        if cv.waitKey(1) & 0xFF == ord('q') :
            break
#5.释放资源
cap.release()
cv.destroyAllWindows()
相关推荐
优秘智能UMI2 分钟前
UMI企业智脑智能营销:多平台视频矩阵引领营销新潮流
大数据·运维·人工智能·ai·矩阵·aigc
清风吹过18 分钟前
因果&Transformer架构论文分享:机器人技术和计算机视觉的位姿估计
计算机视觉·机器人·transformer
热爱生活的猴子19 分钟前
使用bert或roberta模型做分类训练时,分类数据不平衡时,可以采取哪些优化的措施
人工智能·分类·bert
jie*22 分钟前
小杰机器学习高级(five)——分类算法的评估标准
人工智能·python·深度学习·神经网络·机器学习·分类·回归
nju_spy23 分钟前
计算机视觉 - 物体检测 开山鼻祖 R-CNN系列:Fast R-CNN、Faster R-CNN、Mask R-CNN
人工智能·计算机视觉·物体检测·fast r-cnn·r-cnn·mask r-cnn
视觉AI36 分钟前
如何实现 5 μm 精度的视觉检测?不仅仅是相机的事
人工智能·机器人·视觉检测·相机
这张生成的图像能检测吗39 分钟前
(论文速读)DiffBlender:可组合和通用的多模态文本到图像扩散模型
人工智能·深度学习·计算机视觉·文生图·扩散模型
清***鞋1 小时前
转行AI产品如何准备面试
人工智能·面试·职场和发展
AI_Gump1 小时前
Qwen-image-edit在ComfyUI部署使用
人工智能·comfyui
飞哥数智坊1 小时前
打造我的 AI 开发团队(三):bmad 如何实现规划与开发闭环
人工智能·ai编程