Mediapipe框架介绍及使用说明

介绍

        Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到算机视觉、音频处理、姿势估计等领域。Mediapipe实际上是一个集成的机器学习视觉算法的工具库(包含人脸检测、人脸关键点、手势识别、头像分割和姿态识别等各种模型),该库提供了一系列预训练模型和工具,可以帮助开发者快速构建和部署计算机视觉和音频处理应用。它提供了一套易于使用的API,可以用于实时姿势估计、手势识别、面部识别、目标跟踪等任务。

相关网址

参考网址:https://developers.google.cn/mediapipe 

官网地址:https://mediapipe.dev/

Github开源项目地址:https://github.com/google/mediapipe

一些模型的web体验地址(用到电脑摄像头):

   人脸检测:https://code.mediapipe.dev/codepen/face_detection
   人脸关键点:https://code.mediapipe.dev/codepen/face_mesh
   手势识别:https://code.mediapipe.dev/codepen/hands
   姿态识别:https://code.mediapipe.dev/codepen/pose
   自拍头像分割:https://code.mediapipe.dev/codepen/selfie_segmentation

特点 

Mediapipe库的主要特点包括:

  • 实时性能:提供高效的实时处理能力,适用于实时应用程序和流媒体处理,各种模型基本上可以做到实时运行且速度较快。
  • 跨平台支持和多语言支持:支持在多个平台上运行,包括Android、iOS、Windows和Linux等,支持C++,Python,JAVAScript,Coral等主流编程语言。
  • 灵活性:可以根据需要自定义和扩展,适用于各种不同的应用场景。
  • 高质量的预训练模型:提供了一系列经过训练的模型,可以直接用于各种计算机视觉和音频处理任务

开发

使用Mediapipe库进行开发,通常需要以下步骤:

1.安装Mediapipe库:可以使用pip命令来安装Mediapipe库,例如:pip install mediapipe
2.导入Mediapipe库:在Python代码中导入Mediapipe库,例如:import mediapipe as mp
3.加载预训练模型:使用Mediapipe库提供的模型,加载需要的预训练模型,例如:hands = mp.solutions.hands.Hands()
4.处理输入数据:将需要处理的输入数据传递给加载的模型,例如:results = hands.process(image)
5.获取结果:从处理结果中提取需要的信息,例如:landmarks = results.multi_hand_landmarks
6.进行后续处理:根据需要对结果进行进一步处理或应用。

        以上是使用Mediapipe库进行开发的基本步骤。具体的使用方法和示例代码可以参考Mediapipe官方文档和示例代码。

支持的Python版本

      Mediapipe库支持的Python版本包括:

  1. Python 3.7
  2. Python 3.8
  3. Python 3.9
  4. Python 3.10

这些是当前Mediapipe库所支持的Python版本。请注意,某些功能可能仅在特定的Python版本中可用。因此,建议使用最新版本的Python来获得最佳的兼容性和性能。

应用

Mediapipe手势识别

   import cv2
   import mediapipe as mp
   mp_drawing = mp.solutions.drawing_utils
   mp_hands = mp.solutions.hands
   hands = mp_hands.Hands(
       static_image_mode=False,
       max_num_hands=2,
       min_detection_confidence=0.75,
       min_tracking_confidence=0.75)
   cap = cv2.VideoCapture(0)
   while True:
       ret, frame = cap.read()
       frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
       # 因为摄像头是镜像的,所以将摄像头水平翻转
       # 不是镜像的可以不翻转
       frame = cv2.flip(frame, 1)
       results = hands.process(frame)     # process()是手势识别最核心的方法,通过调用这个方法,将窗口对象作为参数,mediapipe就会将手势识别的信息存入到res对象中
       frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
       if results.multi_handedness:
           for hand_label in results.multi_handedness:
               print(hand_label)
       if results.multi_hand_landmarks:
           for hand_landmarks in results.multi_hand_landmarks:
               print('hand_landmarks:', hand_landmarks)
               # 关键点可视化
               mp_drawing.draw_landmarks(
                   frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
       cv2.imshow('MediaPipe Hands', frame)
       if cv2.waitKey(1) & 0xFF == 27:
           break
   cap.release()

mp.solutions.drawing_utils是一个绘图模块,将识别到的手部关键点信息绘制道cv2图像中,mp.solutions.drawing_style定义了绘制的风格。
mp.solutions.hands是mediapipe中的手部识别模块,可以通过它调用手部识别的api,然后通过调用mp_hands.Hands初始化手部识别类。
mp_hands.Hands中的参数:
1)static_image_mode=True适用于静态图片的手势识别,Flase适用于视频等动态识别,比较明显的区别是,若识别的手的数量超过了最大值,True时识别的手会在多个手之间不停闪烁,而False时,超出的手不会识别,系统会自动跟踪之前已经识别过的手。默认值为False;
2)max_num_hands用于指定识别手的最大数量。默认值为2;
3)min_detection_confidence 表示最小检测信度,取值为[0.0,1.0]这个值约小越容易识别出手,用时越短,但是识别的准确度就越差。越大识别的越精准,但是响应的时间也会增加。默认值为0.5;
4)min_tracking_confience 表示最小的追踪可信度,越大手部追踪的越准确,相应的响应时间也就越长。默认值为0.5。 

 Mediapipe姿态识别

import cv2
   import mediapipe as mp

   if __name__ == '__main__':
       mp_pose = mp.solutions.pose
       pose = mp_pose.Pose(static_image_mode=True,
                           model_complexity=1,
                           smooth_landmarks=True,
                           # enable_segmentation=True,
                           min_detection_confidence=0.5,
                           min_tracking_confidence=0.5)
       drawing = mp.solutions.drawing_utils

       # read img BGR to RGB
       img = cv2.imread("1.jpg")
       img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
       cv2.imshow("input", img)

       results = pose.process(img)
       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()

 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:各帧之间跟踪置信度阈值;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵追慕者

您的支持是我写作分享最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值