四步从0到跑通:RealSense Android 深度测距实战,一张照片读出距离
【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense
手机上的相机能拍照,却答不出面前那张桌子有多远。缺少深度数据,正是 RealSense Android 深度相机应用落不了地手机的症结。读完这篇你会完成三件事:
- 完成 librealsense 依赖配置与相机权限设置,gradle sync 一次通过
- 插上 D400 系列相机后自动识别设备,开启 Android 深度流采集
- 从深度帧读出中心距离,并把彩色照片存进手机存储
一、硬件与软件准备清单
🔧 动手前,先对照清单自查。硬件侧:
- Android 设备,系统版本 6.0 及以上,芯片组支持 OTG(OTG 就是让手机当"主机"、外接 USB 设备的功能)
- USB3 OTG 数据线,一端接相机、另一端 OTG 接口插手机,必须支持数据传输
- Intel RealSense D400 系列深度相机,D435i、D455 等型号均可
软件侧:
- 安装最新版 Android Studio
- 把 SDK 源码拉到本地:git clone https://gitcode.com/GitHub_Trending/li/librealsense ,Android 封装层与示例都在仓库的
wrappers/android目录下
平台支持细节可查官方 Android 文档。相机是主角,OTG 线是数据通道,两者齐活才谈得上测距。
二、依赖与权限,一次配到位
打开 app 模块的build.gradle,补上两处内容。RealSense 的 AAR 托管在 maven 仓库,它负责相机权限申请,并提供基于 JNI 的 Java API:
repositories { maven { url "https://egiintel.jfrog.io/artifactory/librealsense" } } dependencies { implementation 'com.intel.realsense:librealsense:2.18.0@aar' }AndroidManifest.xml里再加一行相机权限(Android 9 及以上强制要求):
<uses-permission android:name="android.permission.CAMERA"/>为什么要配这些?AAR 不进来,librealsense 的 Java 类根本找不到;权限不声明,系统不会把相机硬件交给你的应用。配完后 sync 一次 gradle,能导入com.intel.realsense.librealsense包就算过关。
三、从设备插上去到画面出来
画面要分三步走出来。
先,初始化上下文。在应用入口调用一次RsContext.init(getApplicationContext()),多 Activity 项目务必用 Application context,这样各页面才能共享同一个上下文。
再,注册设备监听。RealSense Android 深度相机的插拔动作都会通过回调通知你,由你决定流去还是留:
mRsContext.setDevicesChangedCallback(new DeviceListener() { @Override public void onDeviceAttach() { mStreamingThread.start(); } @Override public void onDeviceDetach() { mStreamingThread.interrupt(); } });最后,启动数据流。在专用线程里创建 Pipeline(可以理解为相机的总调度,负责编排深度、彩色等所有传感器流),调用pipe.start()后帧就开始流动。官方Java 示例用单个 Activity 走完了全部流程,可以直接当骨架照着改:
设备一插,深度画面几秒内点亮。
四、读出距离,拍下照片
原理先说清。深度帧本质上是"每个像素一个距离值",对中心像素调用getDistance,拿到的就是相机到画面中央目标的米制距离,这是实现深度测距最直接的姿势。核心循环不长:
Pipeline pipe = new Pipeline(); 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 distance = depth.getDistance( depth.getWidth() / 2, depth.getHeight() / 2); // 更新界面距离显示,或触发拍照动作 } } } pipe.stop();两层 try 是 try-with-resources,帧读完立刻 close,否则 GC 追不上新帧分配,卡帧就在眼前。
RealSense 拍照保存只有三步:一,从 FrameSet 里取StreamType.COLOR彩色帧;二,把帧的原始数据转成 Bitmap;三,以 JPG 格式写入手机存储。Android 拍照示例已把彩色、深度双画面与保存逻辑全部串好,打开就能对照。📷
距离是数字,照片是凭证,一帧数据两种产出。
五、踩过的坑与下一步
三个高频问题,按"问题→原因→解法"列给你:
- OTG 识别失败→ 手机 OTG 开关没开,或数据线只支持充电 → 在系统设置里打开 OTG,换一根支持数据传输的 USB3 数据线
- 帧率波动、频繁掉帧→ 帧对象没及时释放,缓冲被占满 → 统一走 try-with-resources,读到的 Frame 用完即关
- 权限被拒、画面黑屏→ Android 9 以上需要运行时 CAMERA 权限 → 启动数据流前用
checkSelfPermission检查,未授予就动态申请
若测出的距离跳变明显,可以翻一翻官方后处理滤波示例,看看给深度流加抽取、时序滤波的效果。想从单点距离走向整片场景,再去看测量示例与 examples 目录下的 pointcloud 示例,把深度数据变成点云。
建议你先让相机对准 2 米外的墙面,确认读数落在 1.9 到 2.1 米之间,再谈参数调优。
【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考