ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RealSense Android 深度相机开发:AAR 接入、深度测距与拍照保存全流程

RealSense Android 深度相机开发:AAR 接入、深度测距与拍照保存全流程 RealSense Android 深度相机开发AAR 接入、深度测距与拍照保存全流程【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense给 Android 设备外挂一颗 D400 系列深度相机用 USB3 OTG 线一插手机上就能拿到厘米级的距离数据——这正是 Intel RealSense SDKlibrealsense想解决的问题。实测下来整个链路绕不开三件事AAR 依赖怎么配、RsContext和Pipeline怎么起、深度帧和彩色帧怎么落盘。下面按实际排查顺序讲一遍包含几个容易卡住的点。一、选型依据librealsense 是 Intel 官方的跨平台开源 SDK同一套 C 核心在 Windows、Linux、macOS、Android 上都能跑Android 端通过librealsense.aar提供 JNI 封装的 Java API。它相比直接调 UVC 协议或自己写 libusb 的优势很明显深度帧的解算、坐标变换、滤波链全部内置你只需要消费现成的DepthFrame。适用场景就是需要深度数据的移动设备测距、避障、手势识别、AR 锚定。官方 Android 支持说明在 doc/android.md其中明确校准和固件更新工具暂不在 Android 端提供这些属于产线操作不影响应用层开发。二、原理速览从架构上看上图为官方给出的 Android 应用架构示意手机应用跑在 Java 层librealsense.aar内部包含 JNI 桥和编译好的 native 库native 层负责 USB 设备枚举、UVC 视频流拉取和深度解算。相机通过 OTG 接入后被识别为 USB 设备SDK 的RsContext做设备监听Pipeline负责按你配置的分辨率拉起 depth/color 两路流每收到一对同步帧就回调一个FrameSet。理解帧的生命周期对写 Android 代码特别关键上图是官方帧生命周期流程waitForFrames()每次返回的FrameSet是原生侧分配的硬件资源不是普通 Java 对象GC 不会帮你及时回收。所以官方示例里所有帧对象都走 try-with-resources用完即 close。这条规则在后面踩坑里还会再提一次因为它是新手第一崩因。设备接入后数据流是这样的DeviceListener收到 attach 事件 → 起一个独立线程 →Pipeline.start()拉流 → 循环消费FrameSet→ detach 时 interrupt 线程。Java 侧对相机硬件零感知全部由 AAR 内部的 native 层完成。三、最小可运行路径3.1 把 librealsense AAR 接进工程有两条路直接从 Intel 的 maven 仓库拉预编译 AARexamples/java_example 里用的就是这个方式或者自己打开wrappers/android目录构建 AAR。maven 方式配置如下注意它是个私有仓库地址拉不到就走后一条路repositories { maven { url https://egiintel.jfrog.io/artifactory/librealsense } } dependencies { implementation com.intel.realsense:librealsense:2.18.0aar }自己构建更可控在 wrappers/android 目录执行./gradlew assembleReleaseREADME 说明了 Windows 主机用gradlewLinux 主机用./gradlew产物在wrappers/android/librealsense/build/outputs/aar然后作为本地依赖引入。构建会编译 4 种 ABI耗时几分钟属正常现象。3.2 配置相机权限Android 9 及以上目标设备要求声明 CAMERA 权限在 AndroidManifest.xml 里加一行uses-permission android:nameandroid.permission.CAMERA/运行时动态申请也不能少官方 java_example 的 MainActivity 在onCreate里判断 SDK 版本后调ActivityCompat.requestPermissions。3.3 初始化 RsContext 并监听设备插拔RsContext.init整个应用生命周期只能调一次且必须先于任何设备交互。传 application context 而不是 activity context多 Activity 应用才不会出问题。设备插拔用DeviceListener回调attach 起流、detach 断流RsContext.init(getApplicationContext()); mRsContext new RsContext(); mRsContext.setDevicesChangedCallback(new DeviceListener() { Override public void onDeviceAttach() { mStreamingThread.start(); } Override public void onDeviceDetach() { mStreamingThread.interrupt(); } });3.4 起 Pipeline 拉深度流并测中心点距离流操作放独立线程pipe.start()用 try 包住只为释放 profile 资源。循环里waitForFrames阻塞等新帧取 DEPTH 流后getDistance直接给出中心像素的物理距离单位米这就是智能测距的核心 APIPipeline pipe new Pipeline(); try (PipelineProfile pp pipe.start()) {} while (!mStreamingThread.isInterrupted()) { try (FrameSet frames pipe.waitForFrames()) { try (Frame f frames.first(StreamType.DEPTH)) { DepthFrame depth f.as(Extension.DEPTH_FRAME); float dist depth.getDistance(depth.getWidth()/2, depth.getHeight()/2); runOnUiThread(() - updateUI(dist)); // 回主线程刷新 TextView } } } pipe.stop();3.5 拍照把彩色帧和深度帧落盘拍照不需要额外 APIFrameSet里本来就同时带着 depth 和 color 帧。从 frames 里取出Frame通过data()指针加size()拿到原始字节写入文件即可——彩色帧是 BGRA 格式可用Bitmap的copyPixelsFromBuffer转图后存 JPEG深度帧 16 位建议原样存成depth_时间戳.depth后续配 examples/pointcloud 的思路还原点云。完整取帧和 GL 渲染参考 wrappers/android/examples/capture。四、进阶与调优深度质量滤波裸深度帧噪点多边缘尤其明显。在FrameSet上挂SpatialFilter去噪TemporalFilter跨帧平滑再配HoleFillerFilter补洞测距稳定性会有明显提升。参考 doc/post-processing-filters.md 和 examples/post-processing。GL 渲染与上色把灰色深度图换成彩色叠加预览用 AAR 内的GLRsSurfaceView加Colorizerexamples/capture 演示了frames.applyFilter(colorizer)后upload到 GL 面的完整写法这是移动端展示效果最顺的路径。D400 分辨率预设wrappers/android/librealsense/src/main/assets/presets/下有一整套 JSON 预设高斯/精度/密度组合按场景选分辨率档位比手调Config更快比如测近物用ShortRangePreset.json。五、踩坑速查应用越跑越卡、最后 OOM→ 帧对象是 native 资源GC 跟不上新帧分配速度 → 所有FrameSet/Frame严格 try-with-resourcesPipeline和 context 在onPause/onDestroy显式 closejava_example 的 readme 里对这一点有专门警告。Android 9 设备上直接崩溃或拉不起流→ 高版本目标设备未声明/未授予 CAMERA 权限 → Manifest 加权限声明运行时动态申请后再 init参考 MainActivity 中SDK_INT O的判断分支。热插拔后 app 卡死或崩溃→ detach 事件里还在等waitForFrames线程没退出 → 用DeviceListener.onDeviceDetachinterrupt 流线程onAttach再重新拉起onPause里停流、onResume里恢复是官方示例的标准生命周期写法。六、延伸资源doc/android.mdAndroid 平台官方支持说明依赖要求和构建方式以此为准wrappers/android/readme.md从源码构建 AAR 的完整步骤maven 拉不到 AAR 时的备选方案wrappers/android/examples/java_example最小可运行的 Java 示例含权限、监听、测距全链路wrappers/android/examples/capture带 GL 渲染和 Colorizer 上色的可视化示例拍照展示场景参考它doc/frame_lifetime.md帧生命周期与资源释放规则理解为什么必须 try-with-resources【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表