MediaPipe框架解析(四):android edge_detection详解

在上一章MediaPipe框架解析(三):详解“Hello World! in C++ example”中我们分析了c++的helloworld源码,从而了解了mediapipe框架的基本运行方式。本章将继续分析安卓端的helloworld,相对c++ helloworld,安卓项目设计到的内容更多了,分析起来会更复杂一点。我会先从其产物分析,再到源码分析等步骤来逐步加深了解。

helloworld产物分析

上一章我们生成了helloworld.apk在bazal-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/basic下,在将helloworld.apk重命名为helloworld.zip后解压到当前路径下,会得到如下结构
在这里插入图片描述
我比较关心的有如下文件,但目前还不清楚具体用途:

  • assets/mobile_gpu.binarypb
  • lib/arm64-v8a/libmediapipe_jni.so
  • lib/arm64-v8a/libopencv_java4.so

后续应该会从帧数据的流向并结合这几个关键文件的用途来做源码分析。

源码分析

相机打开

先根据AndroidManifest.xml找到入口MainActivity,在MainActivity的onResume中可以看到应该是使用了CameraXPreviewHelper来打开和预览相机,相机数据通过SurfaceTexture输出。SurfaceTexture经过ExternalTextureConverter的renderNext方法后就将OES纹理转为了Texture2D的纹理,并将该代表相机帧的AppTextureFrame返回到了com.google.mediapipe.components.FrameProcessor.onNewFrame方法中,并在onNewFrame方法中对相机帧做了边缘处理等操作。
在这里插入图片描述

适配层

从“相机打开”中的分析我们可以知道相机数据帧在FrameProcessor.onNewFrame中被MediaGraph框架所捕获。通过java中的FrameProcessor/Graph/AndroidPacketCreator等类实现了将相机帧适配为MediaPipe框架支持的帧数据,再将框架输出的数据又转换为了能直接上屏的帧。

FrameProcessor

FrameProcessor是一个比较重要的核心管理类,这个类中有几个关键角色:Graph/InputStream/OutputStream/Packet/Consumer。
FrameProcessor的构造方法如下:

/**
   * Constructor for video input/output.
   *
   * @param context an Android {@link Context}.
   * @param parentNativeContext a native handle to a GL context. The GL context(s) used by the
   *     calculators in the graph will join the parent context's sharegroup, so that textures
   *     generated by the calculators are availabl
在 Arduino 编译过程中出现 `fatal error: Person_Detection_inferencing.h: No such file or directory` 错误,表明编译器无法找到名为 `Person_Detection_inferencing.h` 的头文件。这类问题通常与文件路径配置、库管理或项目结构有关。以下是可能原因及解决方案: ### 3.1 检查头文件是否存在 确保 `Person_Detection_inferencing.h` 文件确实存在于项目目录中。如果该文件是项目的一部分,但未被正确添加到源码目录中,编译器将无法识别它。请确认以下几点: - 文件是否已正确复制到项目根目录或子目录中。 - 文件名是否拼写正确,包括大小写(例如 `Person_Detection_Inferencing.h` 与 `person_detection_inferencing.h` 是不同的)。 ### 3.2 确认头文件路径 Arduino IDE 默认会在当前项目目录及其子目录中查找头文件。如果 `Person_Detection_inferencing.h` 存放在非项目目录中,需要检查 `#include` 指令的路径是否正确: - 如果文件在当前目录,使用 `#include "Person_Detection_inferencing.h"`。 - 如果文件在子目录(例如 `src/`),使用 `#include "src/Person_Detection_inferencing.h"`。 - 如果该文件是库文件,应使用 `#include <Person_Detection_inferencing.h>`,并确保该库已正确安装到 Arduino 的库目录中。 ### 3.3 将库文件安装到 Arduino 库目录 如果 `Person_Detection_inferencing.h` 是一个库的一部分,需要将其安装到 Arduino 的库目录中。通常路径为: ``` C:\Users\<用户名>\Documents\Arduino\libraries\ ``` 创建一个以库名命名的文件夹(例如 `Person_Detection_Inferencing`),并将头文件和相关源文件放入该目录中。然后在 Arduino IDE 中重新加载库。 ### 3.4 使用 Arduino Library Manager 安装依赖库 如果该项目依赖于某个特定库(例如 TensorFlow Lite Micro 用于机器学习模型推理),可以通过 Arduino IDE 的 Library Manager 安装: 1. 打开 Arduino IDE。 2. 点击菜单栏中的 **工具 > 管理库**。 3. 在搜索框中输入库名(如 `TensorFlowLite` 或 `Person Detection`)。 4. 找到对应库并点击安装。 ### 3.5 使用 PlatformIO 或命令行工具进行更灵活的配置 如果 Arduino IDE 的库管理机制限制了灵活性,可以考虑使用 [PlatformIO](https://platformio.org/) 等更强大的开发环境。PlatformIO 支持自定义头文件路径、依赖管理以及更复杂的项目结构。在 `platformio.ini` 中可以配置: ```ini build_flags = -I../path/to/your/header ``` ### 3.6 检查项目是否依赖生成的头文件 某些项目(尤其是使用 TensorFlow Lite Micro 或 Edge Impulse 生成的模型)会自动生成 `Person_Detection_inferencing.h` 文件。如果未运行模型生成脚本或未正确导出模型文件,该头文件可能不存在。请确认: - 是否已正确导出模型文件。 - 是否已运行必要的脚本或工具生成头文件。 ### 3.7 示例代码结构 确保项目目录结构合理,例如: ``` MyProject/ ├── MyProject.ino ├── Person_Detection_inferencing.h └── src/ └── model_data.cpp ``` 在主 `.ino` 文件中引用头文件的方式应为: ```cpp #include "Person_Detection_inferencing.h" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值