【无需复杂配置!MediaPipe 快速实现人体 + 人脸关键点检测(附完整代码)】

张开发
2026/4/10 2:34:45 15 分钟阅读
【无需复杂配置!MediaPipe 快速实现人体 + 人脸关键点检测(附完整代码)】
姿态检测人体姿态估计是计算机视觉常用技术MediaPipe Pose 提供了开箱即用的方案无需复杂配置就能快速检测静态图片中人体33个3D关键点适合新手入门学习。本文用极简代码实现静态图片姿态检测、关键点坐标输出及可视化。import cv2 import mediapipe as mp if __name__ __main__: mp_pose.Pose()其参数 1)static_image_mode静态图像还是连续帧视频; 2)model_complexity人体姿态估计模型,0表示速度最快,精度最低三者之中,1表示速度中间精度中间三者之中),2表示速度最慢精度最高三者之中; 3)smooth_landmarks是否平滑关键点 4)enable_segmentation是否对人体进行抠图; 5)min_detection_confidence检测置信度阈值 6)min_tracking_confidence各帧之间跟踪置信度阈值 mp_pose mp.solutions.pose pose mp_pose.Pose(static_image_modeTrue, model_complexity1, smooth_landmarksTrue, # enable_segmentationTrue, min_detection_confidence0.5, min_tracking_confidence0.5) drawing mp.solutions.drawing_utils # read img BGR to RGB img cv2.imread(zt1.jpeg) cv2.imshow(input, img) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results pose.process(img) img cv2.cvtColor(img, cv2.COLOR_RGB2BGR) print(len(results.pose_landmarks.landmark)) for i in range(len(results.pose_landmarks.landmark)): xresults.pose_landmarks.landmark[i].x yresults.pose_landmarks.landmark[i].y zresults.pose_landmarks.landmark[i].z print(x,y,z) drawing.draw_landmarks(img, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) cv2.imshow(keypoint, img) drawing.plot_landmarks(results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS) cv2.waitKey(0) cv2.destroyAllWindows()核心功能读取图片、检测33个人体关键点、输出3D坐标、绘制骨架、3D姿态可视化​运行说明运行后会弹出原图、关键点骨架图同时自动弹出3D姿态窗口控制台输出关键点坐标按任意键退出。实时人脸 478 关键点检测传统的人脸关键点仅支持 68 点精度有限而MediaPipe Face Mesh可以实现单张人脸 478 个高精度三维关键点支持实时摄像头检测速度快、精度高、部署简单。这个小项目使用 Python OpenCV MediaPipe快速实现实时摄像头人脸网格检测 关键点编号标注。代码import cv2 import mediapipe as mp # 初始化 Mediapipe 模块 mp_face_mesh mp.solutions.face_mesh#核心人脸网格检测模型 mp_drawing mp.solutions.drawing_utils#提供关键点 / 连线绘制函数 mp_drawing_styles mp.solutions.drawing_styles#提供官方预设的绘制样式 # 设置 Face Mesh 参数 face_mesh mp_face_mesh.FaceMesh( static_image_modeFalse,#视频流模式 max_num_faces2,#最多检测 2 张人脸 refine_landmarksTrue,#开启高精度关键点 min_detection_confidence0.5,#检测阈值 min_tracking_confidence0.5 ) # 打开摄像头 cap cv2.VideoCapture(0) while cap.isOpened(): success, frame cap.read() if not success: print(无法读取摄像头画面) break h, w frame.shape[:2] # 转换颜色空间 frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #OpenCV 读取图像默认是 BGR 格式MediaPipe 只支持 RGB 格式 results face_mesh.process(frame_rgb) # 绘制关键点 if results.multi_face_landmarks: for face_landmarks in results.multi_face_landmarks: # print(len(face_landmarks.landmark)) # 478 #遍历 478 个人脸关键点 for i in range(len(face_landmarks.landmark)): x face_landmarks.landmark[i].x y face_landmarks.landmark[i].y # z face_landmarks.landmark[i].z #x、y 是归一化坐标0~1 # print(x,y,z) cv2.putText(frame, str(i), (int(x * w), int(y * h)), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 255, 0), 2) #绘制人脸网格 mp_drawing.draw_landmarks( imageframe, landmark_listface_landmarks, connectionsmp_face_mesh.FACEMESH_TESSELATION, landmark_drawing_specNone, connection_drawing_specmp_drawing_styles.get_default_face_mesh_tesselation_style() ) # 显示结果 cv2.imshow(Face Mesh, frame) if cv2.waitKey(1)27: break cap.release() cv2.destroyAllWindows()运行结果

更多文章