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个人体骨骼关键点 | 全身姿态、动作分析 | 人体行为基础任务 年龄性别检测 性别、年龄段、属性置信度 人脸属性分析、人群画像 基于人脸检测的衍生任务 人脸换脸 融合后的人脸图像 人脸替换、图像融合特效 人脸关键点+图像融合高阶任务 年龄性别检测 性别、年龄段、属性置信度 人脸属性分析、人群画像 基于人脸检测的衍生任务 |
十、通用开发注意事项
-
所有MediaPipe检测均为轻量离线推理,无需GPU,普通CPU即可实时运行,适合部署在本地设备。
-
所有高阶检测任务(疲劳、手势)均依赖基础关键点检测,关键点精度直接决定最终识别效果。
-
实时画面必须做镜像翻转,符合人眼视觉习惯,避免交互方向错乱。
-
可通过调整
min_detection_confidence置信度参数,平衡检测准确率和实时性。 -
所有代码支持直接运行测试,可基于源码二次开发,拓展自定义手势、自定义疲劳阈值、姿态打分等功能。