Python OpenCV实现人脸、眼睛、嘴巴及鼻子检测完整教程

许南星
许南星
发布时间:2026-10-16| 6人浏览过
原创

本文介绍如何使用Python和OpenCV库进行人脸检测。通过加载Haar级联XML分类器,结合摄像头实时视频流,实现对人脸、眼睛、嘴巴和鼻子的多目标检测与矩形框标记。文章提供了从环境配置、分类器路径查找至完整运行代码的详细步骤,适用于计算机视觉入门及本地部署场景。

OpenCV

OpenCV作为计算机视觉领域广泛使用的开源库,最初由C/C++开发,目前也支持Python语言调用。

OpenCV利用机器学习算法在图像中搜索人脸。由于人脸结构复杂,不存在单一的简单测试能直接判定人脸存在,但算法可以通过匹配数千种微小模式和特征来识别。系统将识别人脸的任务分解为数千个微小的子任务,每个子任务相对容易解决,这些子任务被称为分类器。

代码运行结果展示如下:

具体实现方法如下:

首先需要定位导入的XML分类器文件。

import cv2 
print(cv2.__file__)

找到cv2库的安装路径,进入其中的/data文件夹。

该目录下默认包含部分XML文件,但并非全部。若所需XML文件不在其中,需自行从网络下载并放置于该目录下以便调用。例如,需手动安装并调用'haarcascade_mcs_nose.xml'和'haarcascade_mcs_mouth.xml'文件。

代码导入部分如下:

import cv2

导入XML文件时,可根据具体任务需求选择加载相应的分类器文件。

#人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
#眼睛检测器
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
#嘴巴检测器
mouth_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_mouth.xml')
#鼻子检测器
nose_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_nose.xml')

设置显示窗口参数:

cv2.namedWindow('mytest', 0);
cv2.resizeWindow('mytest', 1500, 1000)

打开摄像头并进行人脸识别处理:

#获取摄像头
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#打开摄像头
cap.open(0)
while cap.isOpened():
    #获取画面
    flag, frame = cap.read()
 
    #人脸检测
    faces = face_cascade.detectMultiScale(frame, 1.3, 2)
    img = frame
    for (x, y, w, h) in faces:
        #根据人脸坐标和长度,宽度画出矩形
        img = cv2.rectangle(img, (x, y), (x+w, y+h),(255, 0 ,0), 2)
        
        #确定人脸范围,在人脸上搜索其他特征
        face_area = img[y:y+h, x:x+w]
        
        #人眼检测
        eyes = eye_cascade.detectMultiScale(face_area, 1.3, 2)
        for (ex, ey, ew, eh) in eyes:
             cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh), (255, 0 ,0), 1)
 
        #嘴巴检测
        mouth = mouth_cascade.detectMultiScale(face_area, 1.5, 2)
        for (mx, my, mw, mh) in mouth:
            cv2.rectangle(face_area, (mx, my), (mx + mw, my + mh), (0, 0, 255), 2)
 
        # 鼻子检测
        nose = nose_cascade.detectMultiScale(face_area, 1.2, 5)
        for (nx, ny, nw, nh) in nose:
            cv2.rectangle(face_area, (nx, ny), (nx + nw, ny + nh), (255, 0, 255), 2)
 
    #画面显示
    cv2.imshow('mytest', img)
    #设置退出按钮
    key_pressed = cv2.waitKey(100)
    print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
    if key_pressed == 27:
        break
 
#关闭摄像头
cap.release()
#关闭图像窗口
cv2.destroyAllWindows()

完整代码实现如下:

import cv2
#人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
#眼睛检测器
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
#嘴巴检测器
mouth_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_mouth.xml')
#鼻子检测器
nose_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_mcs_nose.xml')
 
#获取摄像头
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#打开摄像头
cap.open(0)
cv2.namedWindow('mytest', 0);
cv2.resizeWindow('mytest', 1500, 1000)
while cap.isOpened():
    #获取画面
    flag, frame = cap.read()
 
    #人脸检测
    faces = face_cascade.detectMultiScale(frame, 1.3, 2)
    img = frame
    for (x, y, w, h) in faces:
        #根据人脸坐标和长度,宽度画出矩形
        img = cv2.rectangle(img, (x, y), (x+w, y+h),(255, 0 ,0), 2)
 
        #确定人脸范围,在人脸上搜索其他特征
        face_area = img[y:y+h, x:x+w]
 
        #人眼检测
        eyes = eye_cascade.detectMultiScale(face_area, 1.3, 2)
        for (ex, ey, ew, eh) in eyes:
             cv2.rectangle(face_area, (ex, ey), (ex + ew, ey + eh), (255, 0 ,0), 1)
 
        #嘴巴检测
        mouth = mouth_cascade.detectMultiScale(face_area, 1.5, 2)
        for (mx, my, mw, mh) in mouth:
            cv2.rectangle(face_area, (mx, my), (mx + mw, my + mh), (0, 0, 255), 2)
 
        # 鼻子检测
        nose = nose_cascade.detectMultiScale(face_area, 1.2, 5)
        for (nx, ny, nw, nh) in nose:
            cv2.rectangle(face_area, (nx, ny), (nx + nw, ny + nh), (255, 0, 255), 2)
  
    #画面显示
    cv2.imshow('mytest', img)
    #设置退出按钮
    key_pressed = cv2.waitKey(100)
    print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
    if key_pressed == 27:
        break
 
#关闭摄像头
cap.release()
#关闭图像窗口
cv2.destroyAllWindows()

总结

至此,关于Python实现人脸检测的教程介绍完毕。如需了解更多Python人脸检测相关内容,可搜索本站过往文章或继续阅读后续相关文章,感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。