zoukankan      html  css  js  c++  java
  • 同步AR画面和位姿

    同步 AR 画面和位姿

    为了使屏幕上展示的画面和经过一段时间计算后得到的位姿匹配,需要将画面缓存进队列,一段时间后取出,这里写一下我的实现思路和过程。

    方式

    • 将摄像头预览写到ImageReader
    • 间隔一定帧数取出对应ImageReader队列中的Image放到ImageWriter队列中,ImageWriter队列写到outputSurface上(AR画面中)

    时间表

    帧可用时间序列 1 2 3 4
    传输&计算 传输开始 处理 处理 返回结果
    缓冲 保存1帧 保存2帧 保存3帧 保存第4帧,显示第一帧

    类实现

    • 成员变量
      • ImageReader
        • 在缓冲区中接收写到SurfaceImage
        • 根据时间表,需要至少缓存3帧,保险起见缓冲区大小设置为4帧以上
        • 无法控制接收速度,但能控制输出速度
      • ImageWriter
        • 写出Image到输出的Surface
        • 能控制接收速度,但不能控制输出被取走的速度
      • outputSurface
        • 写出的目标,在我这里是sceneform的SceneViewExternalTexture包含的Surface
    • 成员函数
      • Surface getInputSurface()供摄像头写入画面
      • void setOutputSurface(Surface output)写出到AR的ExternalTextureSurface
      • ImageReader.OnImageAvailableListener在缓冲区满时写出一帧到ImageWriter

    问题

    • 存取画面的延时
      • 只要不超过AR处理延迟(100ms)即可)
    • 存取画面的能耗是否过高
      • 暂时无法验证
    • 输出的Surface不及时取出图像
      • 这会导致堵塞,虽然目前不知道为什么队列堵塞后Surface就一直不会再进行取出操作
      • 解决方法是在writer队列超过一定数量时进行丢帧
  • 相关阅读:
    Ubuntu:替换DASH图标
    使用 python 操作 mongodb 常用的操作
    boost Asio网络编程简介
    optional的使用
    boost中Function和Lambda的使用
    boost多线程入门介绍
    boost中bind的使用
    c++11新标准for循环和lambda表达式
    使用gcc命令编译多个文件
    编辑gif
  • 原文地址:https://www.cnblogs.com/bforever/p/13151285.html
Copyright © 2011-2022 走看看