面包屑图标 当前位置: 首页
AI资讯
热点详情

从零开始教程如何使用Python OpenCV进行面部标志检测

AI热点日报
AI热点日报时间:2026-07-07
热点解读

面部标志检测:用OpenCV和树莓派实战68个关键点 面部标志检测,简单来说就是识别出脸上眉毛、眼睛、鼻子、嘴巴、下巴这些关键部位的位置。这项技术在很多场景中都有用武之地,比如人脸识别、表情分析、甚至美颜滤镜。今天咱们就用OpenCV和树莓派来实战一下,用dlib预训练的68个点面部标志检测器,配合

面部标志检测:用OpenCV和树莓派实战68个关键点

面部标志检测,简单来说就是识别出脸上眉毛、眼睛、鼻子、嘴巴、下巴这些关键部位的位置。这项技术在很多场景中都有用武之地,比如人脸识别、表情分析、甚至美颜滤镜。今天咱们就用OpenCV和树莓派来实战一下,用dlib预训练的68个点面部标志检测器,配合Python OpenCV把检测结果可视化出来。

所需组件

先看看需要哪些家伙:

硬件:树莓派3和Pi摄像头模块。

软件:OpenCV、dlib、imutils、numpy,还有Python3。OpenCV负责图像处理,数字图像处理最常见的应用包括物体检测、人脸识别和人数统计;dlib则提供预训练的机器学习算法;imutils让OpenCV的一些操作更简便。

Pi摄像头与树莓派的接线细节,可以参考之前的教程(这里不再赘述)。

在树莓派中安装OpenCV

安装之前先更新系统:

sudo apt-get update

接着安装OpenCV所需的依赖:

sudo apt-get install libhdf5-dev -y
sudo apt-get install libhdf5-serial-dev -y
sudo apt-get install libatlas-base-dev -y
sudo apt-get install libjasper-dev -y
sudo apt-get install libqtgui4 -y
sudo apt-get install libqt4-test -y

然后安装OpenCV:

pip3 install opencv-contrib-python==4.1.0.25

安装imutils(用于平移、旋转、调整大小、骨架化等图像处理):

pip3 install imutils

安装dlib(机器学习工具包,包含预训练面部标志检测器):

pip3 install dlib

安装NumPy(科学计算核心库):

pip3 install numpy

如何使用dlib检测面部部位

dlib的预训练面部标志检测器可以输出映射到面部结构的68个(x, y)坐标。该预测器在iBUG 300-W数据集上训练,结果可靠。下面这张图标注了每个坐标对应的面部区域:

对Raspberry Pi进行面部地标检测编程

完整代码在文章末尾给出,这里先拆解关键部分。

首先,导入所需库:

from imutils import face_utils
import numpy as np
import argparse
import imutils
import dlib
import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera

初始化摄像头对象,设置分辨率为640×480,帧率30fps:

camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 30
rawCapture = PiRGBArray(camera, size=(640, 480))

使用参数解析器指定面部标志预测器的路径:

ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
                help="面部地标预测路径")
args = vars(ap.parse_args())

初始化基于HOG的dlib面部检测器,并加载预训练的面部特征预测器:

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])

使用capture_continuous从摄像头持续捕获帧:

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    image = frame.array
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF
    rawCapture.truncate(0)

按下键盘“S”键捕获当前帧。然后调整图像尺寸并转为灰度:

if key == ord("s"):
    image = imutils.resize(image, width=300)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

用dlib的检测器发现人脸:

rects = detector(gray, 1)

对每张检测到的人脸,用预测器计算68个面部标志,转换为NumPy数组:

for (i, rect) in enumerate(rects):
    shape = predictor(gray, rect)
    shape = face_utils.shape_to_np(shape)

遍历每个面部区域(如眉毛、眼睛、嘴巴等),在图像上标注名称,并在对应坐标画红点:

for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items():
    clone = image.copy()
    cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                0.7, (0, 0, 255), 2)
    for (x, y) in shape[i:j]:
        cv2.circle(clone, (x, y), 1, (0, 0, 255), -1)

还可以将每个面部部分提取为单独的图像,通过计算边界框并resize到250像素:

(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))
roi = image[y:y + h, x:x + w]
roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC)

最后,显示该部分的单独图像和带标注的全图,按ESC键切换面部区域:

cv2.imshow("ROI", roi)
cv2.imshow("Image", clone)
cv2.waitKey(0)

测试面部识别器

创建一个文件夹,进入目录:

mkdir face-part-detector
cd face-part-detector

从官方链接下载shape_predictor_68_face_landmarks.dat文件,放入该目录。新建detect.py,粘贴下面的完整代码。

运行命令:

python3 detect.py --shape-predictor shape_predictor_68_face_landmarks.dat

你会看到一个实时摄像窗口。按下“S”键捕获一帧,红点会标注在面部区域(默认先显示嘴巴)。用ESC键切换到其他部位,比如眉毛、眼睛、鼻子等。


完整代码

from imutils import face_utils
import numpy as np
import argparse
import imutils
import dlib
import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera
from PIL import Image

camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 30
rawCapture = PiRGBArray(camera, size=(640, 480))

# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
                help="面部地标预测路径")
args = vars(ap.parse_args())

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    image = frame.array
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF
    rawCapture.truncate(0)

    if key == ord("s"):
        image = imutils.resize(image, width=300)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        rects = detector(gray, 1)

        # 循环人脸检测
        for (i, rect) in enumerate(rects):
            # 确定面部区域的面部标志
            shape = predictor(gray, rect)
            shape = face_utils.shape_to_np(shape)

            # 分别循环面部部分
            for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items():
                # 在图像上显示人脸部分的名称
                clone = image.copy()
                cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                            0.7, (0, 0, 255), 2)

                # 在特定的面部部分绘制圆圈
                for (x, y) in shape[i:j]:
                    cv2.circle(clone, (x, y), 1, (0, 0, 255), -1)

                # 提取人脸区域的ROI作为单独的图像
                (x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))
                roi = image[y:y + h, x:x + w]
                roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC)

                # 显示特定的面部部分
                cv2.imshow("ROI", roi)
                cv2.imshow("Image", clone)
                cv2.waitKey(0)

        # 可视化所有面部地标
        for (x, y) in shape:
            cv2.circle(image, (x, y), 1, (0, 0, 255), -1)
        cv2.imshow("Image", image)
        cv2.waitKey(0)
热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:从零开始教程如何使用Python OpenCV进行面部标志检测要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://m.elecfans.com/article/1877051.html
Python

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-07-07 20:10
Dzine AI图像设计工具 卓越构图与风格控制

Dzine是一款强调构图控制与风格管理的AI图像设计工具,提供样式库、图层操作、定位和素描工具,支持文生图与图生图,具备生成填充编辑、一键修复增强及最高6144像素超高清导出功能,降低设计门槛,兼顾新手与专业用户。

AI热点2026-07-07 20:09
Arrival基于云的SaaS解决方案

3D虚拟空间的搭建,过去往往依赖专业建模软件和大量手动操作,技术门槛相当高。但现在,一款名为Arrival的云端SaaS解决方案正凭借AI与拖放功能,将这件事变得像搭积木一样轻松便捷。 什么是Arrival? Arrival本质上是一套专业的软件工具,核心目标就是帮助用户快速构建一个3D虚拟空间。它

AI热点2026-07-07 20:09
AI用户访谈:洞察需求加速产品市场匹配

ZENAI通过AI自动完成用户访谈,省去人工招募与主持流程,并自动总结用户场景、痛点及人物画像。产品经理、设计师、研究员可借此快速验证假设、提炼场景、获取市场洞察,加速产品市场契合度(PMF)达成,提供基础与专业两种套餐。

AI热点2026-07-07 20:09
Meshcapade ME AI生成逼真数字人头像平台

MeshcapadeMe基于SMPL人体模型技术,提供API接口支持图像、视频、测量及3D扫描输入,自动生成统一格式的逼真数字分身,无需专业建模技能即可将各类素材转化为可动画、跨平台使用的数字人类,适用于虚拟现实、游戏与影视等领域。

延伸阅读