MediaPipe手势(Hands)

本文介绍了如何在Ubuntu上克隆MediaPipe源码,构建并替换solution_core和hands模块的aar,以便本地开发和自定义手势识别。涉及步骤包括修改gradle配置、构建aar及解决兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

1、Ubuntu上安装MediaPipe
2、Ubuntu上构建Android的MediaPipe
3、Ubuntu上构建MediaPipe Android Archive (AAR)



前言

最近刚好有手势识别的需求,所以就看到了MediaPipe的Hands,识别出各个手势的节点坐标,然后简单的计算手势。

这一篇主要是对上一篇编译aar库的补充,因为正式使用上我们自己编译的hands aar库。


一、使用步骤

1.克隆MediaPipe的源码

命令如下:

git clone git@github.com:google/mediapipe.git
或者
git clone https://github.com/google/mediapipe.git

2.MediaPipe的Hands例子

打开Android studio,导入Android MediaPipe例子

路径:mediapipe/mediapipe/examples/android/solutions,solutions这个就是Android的Project,将solutions导入Android studio。

运行之后的结果:
在这里插入图片描述

我们接下来需要进行的事情很简单,就是把build.gradle中Google Maven库中的aar替换为我们自己打包的aar。

就是将hands module中如下两个Maven库的aar替换为我们自己打包的aar。

// MediaPipe Hands Solution.
implementation 'com.google.mediapipe:solution-core:latest.release'
implementation 'com.google.mediapipe:hands:latest.release'

构建solution_core.aar

bazel build -c opt --strip=ALWAYS \
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
    --fat_apk_cpu=arm64-v8a,armeabi-v7a \
    --legacy_whole_archive=0 \
    --features=-legacy_whole_archive \
    --copt=-fvisibility=hidden \
    --copt=-ffunction-sections \
    --copt=-fdata-sections \
    --copt=-fstack-protector \
    --copt=-Oz \
    --copt=-fomit-frame-pointer \
    --copt=-DABSL_MIN_LOG_LEVEL=2 \
    --linkopt=-Wl,--gc-sections,--strip-all \
	--verbose_failures \
	//mediapipe/java/com/google/mediapipe/solutioncore:solution_core.aar

构建hands.aar

bazel build -c opt --strip=ALWAYS \
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
    --fat_apk_cpu=arm64-v8a,armeabi-v7a \
    --legacy_whole_archive=0 \
    --features=-legacy_whole_archive \
    --copt=-fvisibility=hidden \
    --copt=-ffunction-sections \
    --copt=-fdata-sections \
    --copt=-fstack-protector \
    --copt=-Oz \
    --copt=-fomit-frame-pointer \
    --copt=-DABSL_MIN_LOG_LEVEL=2 \
    --linkopt=-Wl,--gc-sections,--strip-all \
	--verbose_failures \
	//mediapipe/java/com/google/mediapipe/solutions/hands:hands.aar	

将构建成功的aar导入hands module的libs中

将aar导入libs中,并且注释掉Google官方的Maven库,如下图
在这里插入图片描述

接下来将如下命令写入hands module的build.gradle

// 加载libs中的jar和aar
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

// MediaPipe deps
implementation 'com.google.flogger:flogger:latest.release'
implementation 'com.google.flogger:flogger-system-backend:latest.release'
implementation 'com.google.code.findbugs:jsr305:latest.release'
implementation 'com.google.guava:guava:27.0.1-android'
implementation 'com.google.protobuf:protobuf-javalite:3.19.1'

// CameraX core library
def camerax_version = "1.0.0-beta10"
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"

// AutoValue
def auto_value_version = "1.8.1"
implementation "com.google.auto.value:auto-value-annotations:$auto_value_version"
annotationProcessor "com.google.auto.value:auto-value:$auto_value_version"

到这一步,我们就已经大功告成,直接运行就行了,就把Maven库替换为我们自己的aar了,以后我们自己对代码的修改都可以自己编译aar。Google也建议我们自己编译aar,因为他们没有出满足所有需求的统一的aar。

注意:此时使用的CameraX版本是"1.0.0-beta10",如果将版本更新到最新的“1.1.0-beta01”,因为最新的版本对当前项目最低兼容的minsdk有要求,会出现如下错误。

Execution failed for task ':hands:checkDebugAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
   > The minCompileSdk (31) specified in a
     dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
     is greater than this module's compileSdkVersion (android-30).
     Dependency: androidx.camera:camera-camera2:1.1.0-beta01.
     AAR metadata file: C:\Users\LX\.gradle\caches\transforms-3\00310ff015e50555669b323da52d8e97\transformed\camera-camera2-1.1.0-beta01\META-INF\com\android\build\gradle\aar-metadata.properties.

意思就是当前最新的CameraX最小编译版本(android-31)大于了我当前Hands module的最大编译版本(android-30)。

我们可以从build.gradle看到我们的targetSdkVersion和compileSdkVersion等于30
在这里插入图片描述
不想解决这个问题,就不更新CameraX,哈哈。

如果你实在是强迫症就想更新,那参考如下解决方式。
1、修改compileSdkVersion和targetSdkVersion为31
2、修改了之后,会告诉你android 12需要显视指定Activity的export属性

Manifest merger failed : Apps targeting Android 12 and higher are required to specify 
an explicit value for `android:exported` when the corresponding component has an intent 
filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

参考链接:日志中是Google的国外官网链接,不科学上网访问不了,请参考android国内官网的链接

在清单文件中,activity的节点显视指定export属性
在这里插入图片描述


二、参考

1、MediaPipe Hands官网文档
2、MediaPipe的GitHub地址


总结

本文仅仅是将MediaPipe Hands的demo运行起来,并且将Google编译的Maven库替换为自己编译的aar,因为如果后续自己有一些需求的变更,可以自己修改代码然后重新生成特别的aar。

### MediaPipe Hands 功能与使用指南 MediaPipe Hands 是 Google 开发的一个用于实时手部关键点检测和跟踪的解决方案。它能够高效地识别单手或多手的手指关节位置,并提供精确的关键点坐标,适用于多种应用场景。 #### 1. **核心功能** MediaPipe Hands 提供了以下主要功能: - 实时手部姿态估计:通过摄像头捕获图像并分析出手掌及其手指的位置[^2]。 - 多手支持:默认情况下可以检测一只手的姿态;如果需要同时检测多只手,则可以通过配置参数启用 multi-hand 模型[^1]。 - 高精度关键点定位:返回每根手指上的 21 个三维世界坐标以及对应的屏幕像素坐标。 #### 2. **基本工作流程** 以下是基于 Python 的典型使用步骤: ##### (a) 安装依赖项 确保已安装必要的库,例如 `opencv-python` 和 `mediapipe`: ```bash pip install mediapipe opencv-python ``` ##### (b) 导入库 在脚本中引入所需的模块: ```python import cv2 import mediapipe as mp ``` ##### (c) 初始化 Hand 对象 创建一个实例化对象以加载预训练模型: ```python mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=False, # 是否静态模式,默认动态 max_num_hands=2, # 最大检测双手数量 min_detection_confidence=0.5, # 最低置信度阈值 min_tracking_confidence=0.5 # 跟踪最低置信度 ) ``` ##### (d) 图像处理与结果解析 读取视频帧并对每一帧运行推理过程: ```python cap = cv2.VideoCapture(0) while cap.isOpened(): success, image = cap.read() if not success: break # 将 BGR 转换为 RGB 并标记不可写入状态提升性能 image.flags.writeable = False rgb_frame = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 运行推断逻辑 results = hands.process(rgb_frame) # 如果有检测到手则绘制关键点连线图 if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: mp_drawing.draw_landmarks( image, handLms, mp_hands.HAND_CONNECTIONS ) # 显示画面 cv2.imshow('Hand Tracking', image) if cv2.waitKey(5) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 以上代码展示了如何设置环境并通过摄像头捕捉手部动作。 #### 3. **Android 编译集成** 对于 Android 应用开发而言,需按照特定方式构建 AAR 文件以便嵌入至项目当中。具体操作如下所示: 编辑 BUILD 文件指定所需组件名称及相关计算器集合路径: ```bazel load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar") mediapipe_aar( name = "mediapipe_hand_tracking", calculators = [ "//mediapipe/graphs/hand_tracking:mobile_calculators" ], ) ``` 当希望切换至双手法则替换对应字段内容即可[^1]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃骨头不吐股骨头皮

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值