Flutter同时使用arcore与camera插件相机资源独占问题咨询
ARCore独占相机资源对接目标检测的可行方案
- 方案一:复用ARCore原生相机帧做推理(成本最低、稳定性最高,优先选)
不需要单独接入第三方Camera插件开独立采集会话,直接用ARCore开放的帧获取能力拿相机原始数据喂模型即可,全程只有ARCore持有相机控制权,从根源避免资源抢占。
你可以在ARCore Session的每帧更新回调里,通过Frame.acquireCameraImage()接口拿到YUV_420_888格式的原始预览帧,把帧数据传到推理线程喂给目标检测模型就行,检测到目标后直接走ARCore的渲染逻辑叠加3D对象即可。
注意不要在主线程/ARCore渲染线程跑模型推理,避免阻塞追踪流程;拿到的Image对象用完要及时调用close()方法释放,不然会出现内存泄漏导致ARCore断追踪。 - 方案二:第三方Camera插件作为唯一相机持有方,中转帧数据给ARCore
如果你现有业务逻辑已经深度绑定第三方Camera插件,改造成本过高,可以让第三方Camera插件独占相机资源,采集到的预览帧一方面传给目标检测模型做推理,另一方面通过共享Surface把帧数据、相机内参、帧时间戳同步传给ARCore的外部帧输入接口,让ARCore不用直接访问相机,只基于传入的帧做运动追踪、平面检测。
这个方案需要注意严格对齐传给ARCore的帧时间戳、相机畸变参数、焦距信息,不然会出现3D对象漂移、和检测目标位置对不齐的问题。 - 避坑提醒
不要尝试通过多进程、权限拆分的方式让两个模块同时打开相机,安卓相机HAL层本身就不支持同个相机传感器被多个高优先级会话同时占用,强行这么做要么后启动的模块直接崩溃,要么两边拿到的帧都存在严重掉帧、花屏问题,完全达不到业务可用的稳定性。
实际落地验证:之前做AR展品识别叠加3D介绍模型的需求时,用方案一上线后连续运行2小时以上无相机抢占崩溃问题,3D模型和检测目标的对齐误差能控制在1cm以内,推理帧率和AR追踪帧率互不影响。
内容的提问来源于stack exchange,提问作者MONTASER ABDMAJID ZEHRI
相关产品推荐
相关产品推荐

