mediapipe新版本怎么玩--面部特征检测

张开发
2026/4/13 11:40:41 15 分钟阅读

分享文章

mediapipe新版本怎么玩--面部特征检测
文章目录环境配置一、导入包二、面部图像检测1.模型路径2.人脸网格可视化工具MediaPipe 0.10 官方原版3. 加载图片与可视化二、视频的人脸检测3. 摄像头的模式检测总结环境配置上一篇文章讲了环境问题其他环境配置交给ai来解决先说面部特征检测一、导入包importcv2importnumpyasnpfromPILimportImageimportmediapipeasmpfrommediapipe.tasksimportpythonfrommediapipe.tasks.pythonimportvision二、面部图像检测1.模型路径base_optionspython.BaseOptions(model_asset_path./tasks/face_landmarker.task)# 2. 用 FaceLandmarkerOptions 替代 FaceDetectorOptionsoptionsvision.FaceLandmarkerOptions(base_optionsbase_options,num_faces1,# 最大检测人脸min_face_detection_confidence0.7,min_tracking_confidence0.7,output_facial_transformation_matrixesTrue)# 3. 创建 FaceLandmarker 替代 FaceDetectordetectorvision.FaceLandmarker.create_from_options(options)2.人脸网格可视化工具MediaPipe 0.10 官方原版代码如下示例mp_facemp.tasks.vision.FaceLandmarksConnections mp_drawingmp.tasks.vision.drawing_utils mp_drawing_stylesmp.tasks.vision.drawing_stylesdefdraw_face_landmarks_on_image(rgb_image,detection_result):face_landmarks_listdetection_result.face_landmarks annotated_imagenp.copy(rgb_image)# 遍历每一张人脸forface_landmarksinface_landmarks_list:# 绘制完整人脸网格468个点连线mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_TESSELATION,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_tesselation_style())# 绘制面部轮廓mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_CONTOURS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_contours_style())# 绘制左右虹膜开启refine_landmarks后生效mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_LEFT_IRIS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_iris_connections_style())mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_RIGHT_IRIS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_iris_connections_style())returnannotated_image3. 加载图片与可视化# 加载图片image_cvcv2.imread(imgs/girl.jpg)## 自己搞一个数据集 自拍也行rgb_imagecv2.cvtColor(image_cv,cv2.COLOR_BGR2RGB)mp_imagemp.Image(image_formatmp.ImageFormat.SRGB,datargb_image)# 执行检测FaceLandmarkerdetection_resultdetector.detect(mp_image)# 可视化完整468个点annotated_imagedraw_face_landmarks_on_image(rgb_image,detection_result)# 显示保存cv2.imshow(Face Landmark Result,cv2.cvtColor(annotated_image,cv2.COLOR_RGB2BGR))cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite(imgs/face_landmark_result.jpg,cv2.cvtColor(annotated_image,cv2.COLOR_RGB2BGR))二、视频的人脸检测导入包还是那些BaseOptionsmp.tasks.BaseOptions# 1. 模型路径换成 face_landmarker.task之前给你的模型地址base_optionspython.BaseOptions(model_asset_path./tasks/face_landmarker.task)FaceLandmarkermp.tasks.vision.FaceLandmarker FaceLandmarkerOptionsmp.tasks.vision.FaceLandmarkerOptions VisionRunningModemp.tasks.vision.RunningMode# Create a face landmarker instance with the video mode:optionsFaceLandmarkerOptions(base_optionsbase_options,running_modeVisionRunningMode.VIDEO)# ----------------------# 1. 配置参数按需修改# ----------------------MODEL_PATH./tasks/face_landmarker.task# 你的模型路径INPUT_VIDEO_PATH./imgs/test.avi# 输入视频路径OUTPUT_VIDEO_PATH./imgs/face_landmark_result.avi# 输出视频路径# ----------------------# 2. 初始化MediaPipe相关工具# ----------------------mp_facemp.tasks.vision.FaceLandmarksConnections mp_drawingmp.tasks.vision.drawing_utils mp_drawing_stylesmp.tasks.vision.drawing_styles# ----------------------# 3. 可视化函数绘制468个人脸关键点# ----------------------defdraw_face_landmarks_on_image(rgb_image,detection_result):annotated_imagenp.copy(rgb_image)face_landmarks_listdetection_result.face_landmarks# 遍历每一张检测到的人脸forface_landmarksinface_landmarks_list:# 绘制人脸网格468个点的连线mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_TESSELATION,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_tesselation_style())# 绘制面部轮廓mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_CONTOURS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_contours_style())# 绘制虹膜如果开启refine_landmarksmp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_LEFT_IRIS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_iris_connections_style())mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_RIGHT_IRIS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_iris_connections_style())returnannotated_image# ----------------------# 4. 核心视频检测主流程# ----------------------defprocess_video():# STEP 1: 创建FaceLandmarkerVIDEO模式base_optionspython.BaseOptions(model_asset_pathMODEL_PATH)optionsvision.FaceLandmarkerOptions(base_optionsbase_options,running_modevision.RunningMode.VIDEO,# 关键设为VIDEO模式num_faces1,min_face_detection_confidence0.5,min_tracking_confidence0.5)# STEP 2: 打开输入视频capcv2.VideoCapture(INPUT_VIDEO_PATH)ifnotcap.isOpened():raiseFileNotFoundError(f无法打开视频文件{INPUT_VIDEO_PATH})# 获取视频参数fpscap.get(cv2.CAP_PROP_FPS)# 视频帧率widthint(cap.get(cv2.CAP_PROP_FRAME_WIDTH))# 宽度heightint(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 高度frame_countint(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 总帧数# STEP 3: 初始化视频写入器保存结果fourcccv2.VideoWriter_fourcc(*mp4v)# 编码格式outcv2.VideoWriter(OUTPUT_VIDEO_PATH,fourcc,fps,(width,height))# STEP 4: 逐帧处理视频withvision.FaceLandmarker.create_from_options(options)aslandmarker:frame_timestamp_ms0# 初始时间戳mswhilecap.isOpened():ret,framecap.read()ifnotret:break# 视频处理完成# ----------------------# 帧预处理# ----------------------# OpenCV读入的是BGR转RGB适配MediaPipergb_framecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)# 转MediaPipe Image对象mp_imagemp.Image(image_formatmp.ImageFormat.SRGB,datargb_frame)# ----------------------# 执行视频帧检测关键传入时间戳# ----------------------detection_resultlandmarker.detect_for_video(mp_image,frame_timestamp_ms# 每帧的时间戳ms)# ----------------------# 可视化 显示# ----------------------annotated_framedraw_face_landmarks_on_image(rgb_frame,detection_result)# 转BGR用于OpenCV显示/保存bgr_annotated_framecv2.cvtColor(annotated_frame,cv2.COLOR_RGB2BGR)# 显示实时结果按q退出cv2.imshow(Face Landmarker - Video,bgr_annotated_frame)# 保存帧到输出视频out.write(bgr_annotated_frame)# ----------------------# 更新时间戳 退出逻辑# ----------------------frame_timestamp_msint(1000/fps)# 按帧率更新时间戳msifcv2.waitKey(1)0xFFord(q):break# 按q提前退出# STEP 5: 释放资源cap.release()out.release()cv2.destroyAllWindows()print(f视频处理完成结果保存到{OUTPUT_VIDEO_PATH})# ----------------------# 运行主函数# ----------------------if__name____main__:# 确保输出文件夹存在importos os.makedirs(./videos,exist_okTrue)process_video()3. 摄像头的模式检测# ----------------------# 2. 全局变量用于回调函数传值# ----------------------importthreading MODEL_PATH./tasks/face_landmarker.task# 你的模型路径latest_detection_resultNone# 存储最新检测结果result_lockthreading.Lock()# 简单锁保证线程安全# ----------------------# 3. 初始化MediaPipe相关工具# ----------------------mp_facemp.tasks.vision.FaceLandmarksConnections mp_drawingmp.tasks.vision.drawing_utils mp_drawing_stylesmp.tasks.vision.drawing_styles# ----------------------# 5. 可视化函数绘制468个人脸关键点# ----------------------defdraw_face_landmarks_on_image(rgb_image,detection_result):annotated_imagenp.copy(rgb_image)ifdetection_resultisNoneorlen(detection_result.face_landmarks)0:returnannotated_image# 无检测结果时返回原图# 遍历每一张检测到的人脸forface_landmarksindetection_result.face_landmarks:# 绘制人脸网格468个点的连线mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_TESSELATION,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_tesselation_style())# 绘制面部轮廓mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_CONTOURS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_contours_style())# 绘制虹膜开启refine_landmarks后生效mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_LEFT_IRIS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_iris_connections_style())mp_drawing.draw_landmarks(imageannotated_image,landmark_listface_landmarks,connectionsmp_face.FACE_LANDMARKS_RIGHT_IRIS,landmark_drawing_specNone,connection_drawing_specmp_drawing_styles.get_default_face_mesh_iris_connections_style())returnannotated_image# ----------------------# 6. 回调函数异步接收检测结果加锁保证线程安全# ----------------------defresult_callback(result,output_image,timestamp_ms):LIVE_STREAM模式必须的回调函数异步处理检测结果globallatest_detection_result# 加锁避免主线程读取时子线程修改数据导致冲突withresult_lock:latest_detection_resultresult# 更新最新结果# ----------------------# 7. 核心摄像头实时检测主流程# ----------------------importtime CAMERA_ID0defprocess_camera():globallatest_detection_result# STEP 1: 创建FaceLandmarkerLIVE_STREAM模式base_optionspython.BaseOptions(model_asset_pathMODEL_PATH)optionsvision.FaceLandmarkerOptions(base_optionsbase_options,running_modevision.RunningMode.LIVE_STREAM,# 实时流模式num_faces1,min_face_detection_confidence0.5,min_tracking_confidence0.5,#refine_landmarksTrue, # 开启虹膜检测468→478个点result_callbackresult_callback# 必须设置结果回调函数)# STEP 2: 打开摄像头capcv2.VideoCapture(CAMERA_ID)ifnotcap.isOpened():raiseRuntimeError(f无法打开摄像头ID{CAMERA_ID}请检查摄像头是否被占用)# 设置摄像头分辨率降低分辨率提升帧率cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)# STEP 3: 初始化检测器并处理实时流withvision.FaceLandmarker.create_from_options(options)aslandmarker:print(摄像头已启动按 q 退出按 s 保存当前帧)whilecap.isOpened():ret,framecap.read()ifnotret:print(无法读取摄像头帧)break# ----------------------# 帧预处理# ----------------------rgb_framecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)# BGR→RGBmp_imagemp.Image(image_formatmp.ImageFormat.SRGB,datargb_frame)# ----------------------# 异步检测LIVE_STREAM核心# ----------------------frame_timestamp_msint(time.time()*1000)# 当前时间戳mslandmarker.detect_async(mp_image,frame_timestamp_ms)# 异步提交检测# ----------------------# 可视化 显示加锁读取结果# ----------------------withresult_lock:current_resultlatest_detection_result# 安全读取结果annotated_framedraw_face_landmarks_on_image(rgb_frame,current_result)bgr_annotated_framecv2.cvtColor(annotated_frame,cv2.COLOR_RGB2BGR)# RGB→BGR# 添加醒目提示文字cv2.putText(bgr_annotated_frame, 先点击窗口再按按键,(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.8,(0,0,255),# 红色醒目2)cv2.putText(bgr_annotated_frame,q:退出 | s:保存帧,(10,70),cv2.FONT_HERSHEY_SIMPLEX,0.8,(255,0,0),# 蓝色2)# 显示画面强制置顶确保焦点cv2.imshow(MediaPipe Face Landmarker - Camera,bgr_annotated_frame)cv2.setWindowProperty(MediaPipe Face Landmarker - Camera,cv2.WND_PROP_TOPMOST,1)# 窗口置顶# ----------------------# 按键控制# ----------------------keycv2.waitKey(1)0xFFifkeyord(q):break# 按q退出elifkeyord(s):# 按s保存当前帧save_pathfface_camera_frame_{int(time.time())}.jpgcv2.imwrite(save_path,bgr_annotated_frame)print(f 帧已保存{save_path})# STEP 4: 释放资源cap.release()cv2.destroyAllWindows()print(摄像头已关闭)# ----------------------# 运行主函数# ----------------------if__name____main__:process_camera()总结好玩

更多文章