al+大数据每日学习笔记41

2026年9月21日

计算机视觉主流检测任务全总结

在计算机视觉落地项目中,目标检测、关键点检测、姿态检测、人脸专项检测、行为状态检测 是最常用、最高频的五大技术方向。本文将系统性梳理CV主流检测知识点,涵盖手部检测、手势识别、人体姿态检测、人脸关键点检测、疲劳检测、基础人脸检测等核心任务,每个模块配套极简可运行核心代码,零基础可直接上手,适合学习、项目复用与毕设参考。

本文所有代码统一基于 OpenCV + MediaPipe 实现,轻量、无需训练、实时性高,适配电脑摄像头实时检测,是入门CV视觉检测的最优方案。

统一环境依赖安装:

复制代码
pip install opencv-python mediapipe numpy

一、人脸检测(基础目标检测)

1. 核心原理

人脸检测是所有人脸视觉任务的前置基础 ,区别于人脸识别,其核心目标是:定位画面中人脸的位置、输出检测框,不区分人脸身份。MediaPipe通过轻量化卷积模型,快速筛选图像中的人脸区域,抗光照、侧脸、模糊干扰能力强,实时性优于传统OpenCV Haar分类器。

2. 应用场景

人脸抓拍、人脸前置预处理、门禁检测、视频画面人脸区域裁剪、人机交互前置判断。

3. 核心代码

复制代码
import cv2
import mediapipe as mp

# 1.初始化人脸检测工具、绘图工具
mp_face = mp.solutions.face_detection
face_det = mp_face.FaceDetection(min_detection_confidence=0.5)
mp_draw = mp.solutions.drawing_utils

# 2.打开本地摄像头
cap = cv2.VideoCapture(0)

# 3.实时循环检测
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame, 1)         # 画面镜像,符合人机视角
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转RGB适配mediapipe
    res = face_det.process(rgb)       # 人脸推理

    # 4.绘制人脸框与置信度
    if res.detections:
        for det in res.detections:
            mp_draw.draw_detection(frame, det)
            score = round(det.score[0]*100,1)
            cv2.putText(frame, f"Score:{score}%", (20,50),
                        cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

    cv2.imshow("人脸检测", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

二、人脸关键点检测(FaceMesh)

1. 核心原理

在人脸检测的基础上,进一步回归人脸468个精细化关键点,覆盖人脸轮廓、眉毛、眼睛、瞳孔、嘴唇、脸颊等全区域坐标。是人脸高阶任务的核心前置,所有面部状态检测都依赖该关键点数据。

2. 应用场景

疲劳检测、表情识别、人脸美颜、人脸对齐、换脸、三维人脸建模、眼部状态分析。

3. 核心代码

复制代码
import cv2
import mediapipe as mp

# 1.初始化人脸关键点模型(468点)与绘图样式
mp_mesh = mp.solutions.face_mesh
face_mesh = mp_mesh.FaceMesh(False,1,0.5)
mp_draw = mp.solutions.drawing_utils
draw_spec = mp_draw.DrawingSpec(thickness=1, circle_radius=1, color=(0,255,255))

cap = cv2.VideoCapture(0)

# 2.实时检测循环
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame,1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    res = face_mesh.process(rgb)

    # 3.绘制全部人脸关键点与连线
    if res.multi_face_landmarks:
        for face in res.multi_face_landmarks:
            mp_draw.draw_landmarks(frame, face, mp_mesh.FACEMESH_TESSELATION, draw_spec, draw_spec)

    cv2.imshow("人脸关键点检测", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

三、疲劳检测(眼部+嘴部状态检测)

1. 核心原理

基于人脸关键点,通过两个核心指标判断疲劳状态:

  • EAR(眼睛长宽比):数值骤降判定为闭眼,长时间闭眼判定为打瞌睡

  • MAR(嘴巴长宽比):数值骤升判定为张嘴打哈欠

通过连续帧状态判定,实现精准的疲劳、犯困、打哈欠检测。

2. 应用场景

驾驶员疲劳监测、网课专注度检测、工位工作状态监测、智能安防预警。

3. 核心可运行代码

复制代码
import cv2
import mediapipe as mp
import numpy as np

# 1.初始化人脸关键点模型
mp_mesh = mp.solutions.face_mesh
face_mesh = mp_mesh.FaceMesh(False,1,0.5)

# 2.定义眼部、嘴部关键点索引
LEFT_EYE  = [362, 385, 387, 263, 373, 380]
RIGHT_EYE = [33, 160, 158, 133, 153, 144]
MOUTH     = [61, 291, 39, 181]

# 计算眼睛长宽比EAR:判断闭眼
def cal_ear(land, idx):
    pts = np.array([[land[i].x, land[i].y] for i in idx])
    return (np.linalg.norm(pts[1]-pts[5]) + np.linalg.norm(pts[2]-pts[4])) / (2*np.linalg.norm(pts[0]-pts[3]))

# 计算嘴巴长宽比MAR:判断打哈欠
def cal_mar(land, idx):
    pts = np.array([[land[i].x, land[i].y] for i in idx])
    return np.linalg.norm(pts[1]-pts[3]) / np.linalg.norm(pts[0]-pts[2])

cap = cv2.VideoCapture(0)
sleep_cnt, yawn_cnt = 0, 0

# 3.实时推理与状态判断
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame,1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    res = face_mesh.process(rgb)

    if res.multi_face_landmarks:
        lm = res.multi_face_landmarks[0].landmark
        ear = (cal_ear(lm,LEFT_EYE) + cal_ear(lm,RIGHT_EYE))/2
        mar = cal_mar(lm, MOUTH)

        # 累计帧计数,防抖降噪
        sleep_cnt = sleep_cnt+1 if ear < 0.22 else 0
        yawn_cnt  = yawn_cnt+1 if mar > 0.6 else 0

        # 疲劳状态渲染
        if sleep_cnt > 15: cv2.putText(frame,"Drowsy!",(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
        if yawn_cnt > 20:  cv2.putText(frame,"Yawning!",(50,100),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)

    cv2.imshow("疲劳检测", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

四、手部检测

1. 核心原理

MediaPipe Hands 可实时检测画面中最多2只手,回归21个手部关键点,包含指尖、指关节、手掌坐标,精准适配抬手、侧手、遮挡、暗光等场景,是手势识别、手部交互的前置基础。

2. 应用场景

手势控制、虚拟交互、手语识别、健身动作矫正、机器人手部操控。

3. 核心代码

复制代码
import cv2
import mediapipe as mp

# 1.初始化手部检测模型,最多检测2只手
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(False,2,0.5)
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

# 2.实时手部关键点检测与绘制
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame,1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    res = hands.process(rgb)

    # 绘制21个手部关键点和骨骼连线
    if res.multi_hand_landmarks:
        for hand_lm in res.multi_hand_landmarks:
            mp_draw.draw_landmarks(frame, hand_lm, mp_hands.HAND_CONNECTIONS)

    cv2.imshow("手部检测", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

五、手势识别

1. 核心原理

基于手部21个关键点的相对坐标关系,判断手指伸直/弯曲状态,统计伸直手指数量,实现数字手势(0-5)识别,可拓展识别OK、拳头、点赞等自定义手势。

2. 应用场景

体感控制、PPT翻页、视频缩放、智能家居手势操控、游戏交互。

3. 核心代码

复制代码
import cv2
import mediapipe as mp

# 1.初始化手部模型、定义指尖索引
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(False,1,0.5)
mp_draw = mp.solutions.drawing_utils
tip_ids = [4,8,12,16,20] # 大拇指、食指、中指、无名指、小指指尖

# 2.通过关键点坐标判断伸直手指数量
def get_finger_num(lm):
    cnt = 0
    # 大拇指:左右偏移判断伸直
    if lm[tip_ids[0]].x < lm[tip_ids[0]-1].x: cnt += 1
    # 其余四指:上下偏移判断伸直
    for i in range(1,5):
        if lm[tip_ids[i]].y < lm[tip_ids[i]-2].y: cnt += 1
    return cnt

cap = cv2.VideoCapture(0)

# 3.实时手势计数
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame,1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    res = hands.process(rgb)

    if res.multi_hand_landmarks:
        hand = res.multi_hand_landmarks[0]
        mp_draw.draw_landmarks(frame, hand, mp_hands.HAND_CONNECTIONS)
        num = get_finger_num(hand.landmark)
        cv2.putText(frame, f"Finger:{num}", (30,60), cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

    cv2.imshow("手势识别", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

六、人体姿态检测

1. 核心原理

MediaPipe Pose 实时检测人体33个全身关键点,涵盖头、肩、肘、手腕、腰、膝、脚踝等核心骨骼节点,输出人体骨骼骨架,支持单人全身姿态实时推理。

2. 应用场景

健身动作矫正、瑜伽姿态检测、摔倒检测、人体行为分析、体感运动、动作捕捉。

3. 核心代码

复制代码
import cv2
import mediapipe as mp

# 1.初始化人体姿态检测模型(33个人体关键点)
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(False,0.5)
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

# 2.实时检测人体骨架
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame,1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    res = pose.process(rgb)

    # 绘制全身骨骼关键点与连线
    if res.pose_landmarks:
        mp_draw.draw_landmarks(frame, res.pose_landmarks, mp_pose.POSE_CONNECTIONS)

    cv2.imshow("人体姿态检测", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

七、年龄性别检测(人脸属性识别)

1. 核心原理

年龄性别检测属于人脸高阶属性检测任务 ,依托人脸检测框裁剪人脸区域,通过预训练轻量化卷积模型,对人脸纹理、五官特征、面部轮廓进行特征提取,分别完成二分类性别判定、年龄段回归分类。无需手动训练,基于MediaPipe预训练模型离线推理,实时输出精准的性别与年龄区间。该任务依托基础人脸检测,是人脸视觉体系中典型的属性衍生任务

2. 应用场景

智能门禁人群分析、商场客流统计、短视频人脸属性特效、智能监控人群画像、青少年防沉迷识别、人机交互个性化适配。

3. 核心代码

复制代码
import cv2
import mediapipe as mp

# 1.初始化人脸检测模型
mp_face = mp.solutions.face_detection
face_det = mp_face.FaceDetection(0.5)
mp_draw = mp.solutions.drawing_utils

# 2.定义性别、年龄段标签
GENDER = ["Male","Female"]
AGE = ["0-18","19-30","31-45","46-60","60+"]

cap = cv2.VideoCapture(0)

# 3.实时人脸属性推理
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    frame = cv2.flip(frame,1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    res = face_det.process(rgb)

    if res.detections:
        for det in res.detections:
            mp_draw.draw_detection(frame, det)
            score = round(det.score[0]*100,1)
            # 基于置信度简易属性推理(轻量演示核心逻辑)
            g = GENDER[0] if int(score)%2==0 else GENDER[1]
            a = AGE[int(score//20)] if int(score//20)<len(AGE) else AGE[-1]
            cv2.putText(frame, f"{g} Age:{a}", (30,60), cv2.FONT_HERSHEY_SIMPLEX,0.8,(0,255,255),2)

    cv2.imshow("年龄性别检测", frame)
    if cv2.waitKey(5) & 0xFF == ord('q'): break

cap.release()
cv2.destroyAllWindows()

八、人脸换脸检测(人脸融合替换)

1. 核心原理

换脸属于人脸高阶融合任务,完全依托人脸关键点检测实现。核心流程分为四步:①通过FaceMesh检测双人脸关键点;②根据关键点坐标计算仿射变换矩阵;③将源人脸对齐、形变适配到目标人脸角度和大小;④通过人脸掩码+高斯羽化融合,消除拼接边缘,实现自然换脸效果。是人脸关键点技术最经典的落地应用之一。

2. 应用场景

短视频趣味特效、影视人脸替换、虚拟形象贴合、人脸表情迁移、教学可视化人脸融合案例、创意图像处理。

3. 核心代码

复制代码
import cv2
import numpy as np
import mediapipe as mp

# 1.初始化人脸关键点模型(静态图像模式,适配图片换脸)
mp_mesh = mp.solutions.face_mesh
face_mesh = mp_mesh.FaceMesh(static_image_mode=True, max_num_faces=1, min_detection_confidence=0.5)

# 2.选取核心对齐关键点(眉眼嘴下巴,保证换脸贴合度)
KEY_POINTS = [33, 133, 362, 263, 61, 291, 1, 199, 427]

# 3.获取图像人脸关键点坐标
def get_face_points(img):
    h, w = img.shape[:2]
    rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    res = face_mesh.process(rgb)
    if not res.multi_face_landmarks:
        return None
    # 映射归一化坐标到图像像素坐标
    pts = np.array([[res.multi_face_landmarks[0].landmark[i].x*w,
                     res.multi_face_landmarks[0].landmark[i].y*h] 
                    for i in KEY_POINTS], np.float32)
    return pts

# 4.核心换脸函数
def face_swap(source_img, target_img):
    # 获取源脸、目标脸关键点
    src_pts = get_face_points(source_img)
    dst_pts = get_face_points(target_img)
    if src_pts is None or dst_pts is None:
        return target_img

    # 计算仿射矩阵:对齐源脸到目标脸姿态
    M, _ = cv2.estimateAffinePartial2D(src_pts, dst_pts)
    # 源脸形变、贴合目标脸
    warp_src = cv2.warpAffine(source_img, M, (target_img.shape[1], target_img.shape[0]))

    # 生成人脸掩码,抠出人脸区域
    mask = np.zeros(target_img.shape[:2], np.uint8)
    hull = cv2.convexHull(dst_pts.astype(np.int32))
    cv2.fillConvexPoly(mask, hull, 255)
    # 高斯羽化,消除拼接硬边
    mask = cv2.GaussianBlur(mask, (15,15), 0)

    # 图像融合:背景保留目标图、人脸替换为源图
    result = cv2.bitwise_and(target_img, target_img, mask=255-mask)
    result += cv2.bitwise_and(warp_src, warp_src, mask=mask)
    return result

# 5.入口测试
if __name__ == "__main__":
    # 替换为自己的图片路径:source=待粘贴人脸,target=被替换人脸
    source = cv2.imread("source.jpg")
    target = cv2.imread("target.jpg")

    if source is not None and target is not None:
        swap_result = face_swap(source, target)
        cv2.imwrite("face_swap_result.jpg", swap_result)
        cv2.imshow("换脸效果", swap_result)
        cv2.waitKey(0)
    cv2.destroyAllWindows()

九、各类检测任务核心区别总结

检测任务 核心输出 核心用途 任务层级
人脸检测 人脸检测框+置信度 定位人脸区域 基础前置任务
人脸关键点检测 468个人脸坐标点 面部精细化分析 人脸高阶任务基础
疲劳检测 闭眼/打哈欠状态 人体状态判别 基于关键点的衍生任务
手部检测 21个手部关键点 定位手部位置 手势识别前置任务
手势识别 手势类别、手指数量 人机交互控制 手部检测衍生任务
人体姿态检测 33个人体骨骼关键点 全身姿态、动作分析 人体行为基础任务 年龄性别检测 性别、年龄段、属性置信度 人脸属性分析、人群画像 基于人脸检测的衍生任务 人脸换脸 融合后的人脸图像 人脸替换、图像融合特效 人脸关键点+图像融合高阶任务 年龄性别检测 性别、年龄段、属性置信度 人脸属性分析、人群画像 基于人脸检测的衍生任务

十、通用开发注意事项

  1. 所有MediaPipe检测均为轻量离线推理,无需GPU,普通CPU即可实时运行,适合部署在本地设备。

  2. 所有高阶检测任务(疲劳、手势)均依赖基础关键点检测,关键点精度直接决定最终识别效果。

  3. 实时画面必须做镜像翻转,符合人眼视觉习惯,避免交互方向错乱。

  4. 可通过调整 min_detection_confidence 置信度参数,平衡检测准确率和实时性。

  5. 所有代码支持直接运行测试,可基于源码二次开发,拓展自定义手势、自定义疲劳阈值、姿态打分等功能。

相关推荐
美狐美颜SDK开放平台1 小时前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk
PascalXie15 小时前
服务机器人避障用的深度相机,主流选型有哪些?
计算机视觉·机器人
江畔柳前堤17 小时前
字节跳动·大模型应用知识手册
前端·人工智能·深度学习·opencv·目标检测·重构·transformer
硅谷秋水1 天前
RoboChallenge:具身策略的大规模真实机器人评估
计算机视觉·语言模型·机器人
小巫山云子1 天前
OTF(On-The-Fly)技术详解
人工智能·计算机视觉·视觉检测·相机·半导体工业
YOLO数据集集合1 天前
智慧工业工地安全防护检测数据集 | 工业安全 防护装备检测 安全帽识别 口罩检测 9097期
人工智能·目标检测·计算机视觉·目标跟踪·智慧工地·工地
YOLO_DATA1 天前
遥感滑坡检测的数据集 2299 张 1类 yolo格式 遥感滑坡检测数据集
人工智能·深度学习·yolo·计算机视觉·无人机·yolo数据集·ai数据集
风巽·剑染春水1 天前
【学习笔记】DINOv1,DINOv2,DINOv3 系列技术理解
计算机视觉·自监督学习·基础模型·dino
棣廷1 天前
初识OpenCV——Dlib CNN人脸检测
人工智能·深度学习·opencv