基于opencv与mediapipe的面部跟踪(人脸检测追踪)python代码实现

该文介绍了如何利用OpenCV读取视频流,并结合Mediapipe库进行面部检测和跟踪。通过设置不同的模型选择和置信度阈值,可以在2米或5米范围内跟踪人脸,输出包括边界框和关键点信息。代码示例展示了实时显示检测结果和计算FPS的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 面部跟踪概述

        面部跟踪主要是从图像或视频中检测出人脸并输出人脸位置及其大小等有效信息,并在后续帧中继续捕获人脸的位置及其大小等信息,实时跟踪人脸。此技术可用于海关、机场、视频会议、拍照对焦、面部打码等业务场景。(与人脸识别是不同范畴)

        本文主要利用opencv读取摄像头或视频文件信息,通过mediapipe对opencv读取的图像数据进行人脸检测跟踪。其中每张人脸都表示为一个检测原型消息。输出结果包含一个边界框:xmin,ymin,width,height 和 6 个关键点(右眼、左眼、鼻尖、嘴巴中心、右耳垂体和左耳垂体),模型有两种模式,一种是距离摄影机2米以内的面的短距离模型,一种是距离摄影机5米以内的面的全范围模型。

2. 面部跟踪python代码实现

        首先利用opencv模块中的VideoCapture类创建一个待检测视频对象

cap = cv2.VideoCapture(vido)

入参vido可以是数字0或1代表调用摄像头,也可以是路径加视频文件名称代表使用视频文件。

        然后调用mediapip模块中的mp.solutions.face_detection模块,使用FaceDetection类创建一个人面部跟踪对象:

mpFace = mp.solutions.face_detection

face = mpFace.FaceDetection(min_detection_confidence=0.5, model_selection=0)

其中两个参数分别代码置信度和检测模式,置信度取值[0,1]的float类型值,取值越高,检测越准确。

模式取值0或1的int类型,使用0则是选择最适合距离摄影机2米以内的面的短距离模型。使用1则是选择最适合距离摄影机5米以内的面的全范围模型。

        最后,使用调用face对象的proc方法,得到检测结果:

results = face.process(img_rgb)

遍历results结果中的值,分别能够得到面部矩形框和6个关键点坐标,注意,这里的坐标都是百分比相对值,实际像素坐标需要乘以图片的长宽像数值。代码如下所示:

import time
import mediapipe as mp
import cv2


def face_detection(vido):
    pTime = 0
    cap = cv2.VideoCapture(vido)
    mpFace = mp.solutions.face_detection
    face = mpFace.FaceDetection(
        min_detection_confidence=0.5,  # 人脸检测模型中的最小置信值
        model_selection=0)  # 使用0选择最适合距离摄影机2米以内的面的短距离模型,使用1选择最适合距离摄影机5米以内的面的全范围模型
    myDraws = mp.solutions.drawing_utils
    keypointStyle = myDraws.DrawingSpec(color=(0, 0, 255), thickness=3)
    bboxStyle = myDraws.DrawingSpec(color=(0, 255, 0), thickness=2)

    while True:
        ret, img = cap.read()
        if ret:
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            results = face.process(img_rgb)
            if results.detections:
                for detection in results.detections:
                    boxLms = detection.location_data.relative_bounding_box
                    print(boxLms)
                    face_key_points = []
                    for i in range(6):
                        face_key_point = mpFace.get_key_point(detection, mpFace.FaceKeyPoint(i))
                        face_key_point = [i, face_key_point.x, face_key_point.y]
                        face_key_points.append(face_key_point)
                    print(face_key_points)
                    myDraws.draw_detection(img, detection, keypointStyle, bboxStyle)
                    cv2.putText(img, f'score:{int(detection.score[0] * 100)}%',
                                (int(boxLms.xmin * img.shape[1]) - 20, int(boxLms.ymin * img.shape[0]) - 20),
                                cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 2)
            cTime = time.time()
            fps = 1 / (cTime - pTime)
            pTime = cTime
            cv2.putText(img, f"FPS:{int(fps)}", (30, 50), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)
            cv2.imshow("Frame", img)
        if cv2.waitKey(1) == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

def main():
    face_detection(0)
    # face_mesh(0)


if __name__ == "__main__":
    main()

三、最终效果

        代码运行效果如下,能够有效检测并追踪人脸面部,对多人面部检测追踪也非常有效,效率极高,对硬件要求低。可根据此方法进行海关、监控等摄像头的人脸检测,能够有效压缩存储空间(画面中无人脸的视频段可不用存储),视频处理人脸马赛克,换头像等应用。值得注意的是,本文讲诉的方法和调用的类库只是人脸检测,人脸识别是另一个范畴,有机会笔者在进行介绍。人脸检测追踪具体效果如下:

xmin: 0.37054682
ymin: 0.56353134
width: 0.2559849
height: 0.341313

[[0, 0.44780921936035156, 0.6519981026649475],

[1, 0.5592537522315979, 0.6494688391685486],

[2, 0.5099092721939087, 0.7245292067527771],

[3, 0.5084657669067383, 0.7989646792411804],

[4, 0.3766010105609894, 0.6967787742614746],

[5, 0.6136240363121033, 0.6912295818328857]]
 

基于OpenCV (Open Source Computer Vision Library)MediaPipe (由Google开发的一个跨平台的框架,用于实时的人体和物体跟踪)面部表情识别系统的完整代码通常包括以下几个步骤: 1. **环境设置**: - 安装必要的库:PythonOpenCVMediaPipe Python SDK。 - 配置Face Mesh模块,这是一个预训练模型,专门用于检测人脸关键点。 ```python !pip install opencv-python mediapipe ``` 2. **初始化**: - 加载FaceMesh模块并设置追踪区域。 ```python import cv2 from mediapipe import Pose pose = Pose( max_num_faces=1, min_detection_confidence=0.5, min_tracking_confidence=0.5) ``` 3. **视频流或摄像头输入**: - 获取摄像头输入,或者读取视频文件作为源。 ```python cap = cv2.VideoCapture(0) while cap.isOpened(): # Capture frame-by-frame ``` 4. **实时面部表情处理**: - 对每一帧应用FaceMesh,获取关键点数据。 - 根据关键点计算面部表情特征,比如眼睛间距、嘴巴形状等。 ```python success, image = cap.read() results = pose.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) if results.pose_landmarks is not None: landmarks = np.array([p.x, p.y, p.z] for p in results.pose_landmarks.landmark) # ... 进行人脸表情分析 ``` 5. **情绪识别算法**: - 可能需要额外的情感分类模型,如基于机器学习或深度学习的模型,来根据关键点数据预测表情。 6. **结果显示**: - 将识别结果可视化,可能显示表情标签或分数。 7. **结束循环**: - 当退出条件满足(如按下停止键)时关闭摄像头。 完整的代码会比较长,这里只是一个简化的概述。实际项目中可能还需要对数据进行预处理,以及训练一个表情识别模型。由于版权原因,提供完整的代码并非易事,但GitHub上有很多开源的示例可供参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值