MediaPipe手势(Hands)

系列文章目录

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。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MediaPipe是一个实时机器学习框架,可以用于各种任务,包括手势识别。MediaPipe手势识别使用深度学习模型和计算机视觉技术来检测手的关键点,并根据这些点的位置预测手势。 要使用MediaPipe手势识别,首先需要安装MediaPipe库并准备好图像或视频数据。然后,可以使用MediaPipe提供的预训练模型或训练自己的模型来执行手势识别。 下面是一个简单的Python示例代码,演示如何使用MediaPipe手势识别: ```python import cv2 import mediapipe as mp # 初始化MediaPipe手势识别模型 mp_hands = mp.solutions.hands # 初始化视频捕获设备 cap = cv2.VideoCapture(0) # 循环读取视频帧 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 将视频帧转换为RGB格式 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 检测手势 with mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.7) as hands: results = hands.process(frame) # 在视频帧上绘制检测结果 if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: mp.solutions.drawing_utils.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS) # 将视频帧转回BGR格式并显示 frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) cv2.imshow('MediaPipe Hands', frame) # 按q键退出循环 if cv2.waitKey(10) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows() ``` 这个示例代码打开了计算机的摄像头,并在循环中读取视频帧。然后,它将每个视频帧转换为RGB格式,并使用MediaPipe手势识别模型检测手势。如果检测到手势,则在视频帧上绘制手的关键点,并将视频帧转回BGR格式并显示。用户可以按下“q”键退出循环。 需要注意的是,这只是一个简单的示例代码,MediaPipe手势识别还有很多参数可以调整,以及更复杂的应用场景需要进一步处理结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃骨头不吐股骨头皮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值