博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网易戏精ARCore短视频新玩法实践
阅读量:5865 次
发布时间:2019-06-19

本文共 4296 字,大约阅读时间需要 14 分钟。

《网易戏精》是网易人工智能事业部旗下一款AI短视频产品,用户可以随手拍出自己的特效视频,其中包含数十个有趣的奇幻道具,其中放置类的道具只需要扫一下平面,即可摆放进现实世界中进行互动,既有充满霓虹灯的旺角街头、会随音乐抖动的DJ打碟台、迪厅球,也有烟雾缭绕的迷幻场景等等。

\"\"

(会随音乐抖动的DJ打碟台)

此类放置类道具在安卓端基于Google的ARCore技术实现。本文整理归纳项目研发中ARCore的使用及研发历程,与大家一起分享在AR应用开发中遇到的问题及实践。主要分为以下几个方面,已有相关经验的ARCore开发者可以选择性跳过。

  1. ARCore简述
  2. ARCore原理的进一步理解
  3. ARCore和ARKit的功能性对比
  4. ARCore API架构梳理
  5. ARCore的兼容性及解决方案
  6. 开发者可能会遇到的Troubleshoot

ARCore简述

ARCore SDK主要由三大模块构成:、环境理解、光照估计。

  1. 运动跟踪可以让手机理解和跟踪它相对于现实世界的位置。
  2. 让手机可以检测各类表面(例如地面、咖啡桌或墙壁等水平、垂直表面)的大小和位置。
  3. 光估计让手机可以估测环境当前的光照条件。

\"\"

ARCore原理的进一步理解

对ARCore底层原理的了解可以帮助我们了解计算的过程以及解决一些问题。

首先,ARCore使用视觉惯性测距系统(Visual Inertial Odometry,简称 VIO)的算法来实现运动跟踪。VIO将从设备的摄像机中识别图像特征与内部运动传感器结合起来,以获得设备的6DOF(6 Degree Of Freedom,6度自由度)信息。我们常说的6DOF指的是三维的位置与三维的旋转,而3DOF常指三维的旋转(直接通过陀螺仪即可获得,比起6DOF计算较为简单)。

\"\"

  (上图即是6DoF的图示)

惯性测量单元(Inertial measurement unit,简称 IMU)的读数大约为1000次每秒并且是基于加速度的(用户的移动)。航迹推算法(Dead Reckoning)用于测量 IMU 读数之间的设备移动,但这种方法推算是一种估算,就像如果我让你向前走一步,然后猜测走了多远一样,此时会用航迹推算法来估计距离。但惯导系统中的误差会随时间累积,所以 IMU 帧率越长,惯导系统从视觉系统中复位后的时间越长,追踪位置距离真实位置偏差就越多。

视觉/光学测量使用的是摄像机来采集视觉信息,设备帧率通常为 30fps 并且依赖距离(不同的场景帧率也有所不同)。光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响),所以用户运动得越远,误差就越大。

惯性导航系统与视觉测量系统各有各的优势和不足。并且视觉和惯性跟踪系统是基于完全不同的测量系统,他们之间并没有相互依赖,所以他们整合在一起可以互相弥补缺陷。这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙),而惯性系统照样可以正常工作,或者设备在完全静止的条件下,视觉系统可以呈现出一个比惯性系统更加稳定的姿态。在此之上这个算法使用卡尔曼滤波器不断地选择最佳姿态,从而实现稳定跟踪。

与ARKit的功能上的对比

为了尽可能保证Android用户和iOS用户的功能一致性,我们整理了ARKit和ARCore在各个版本上的功能。版本上需要注意的是,ARKit的版本取决与手机的操作系统级别,ARCore的运行版本取决于手机上安装的ARCore Runtime Apk,Runtime对SDK采取向下兼容机制,并且用户如首次安装ARCore Runtime Apk后,之后作为内核服务自动更新。

ARKit ARCore
6DOF追踪 支持(1.0)(iOS11) 支持(1.0)
相机分辨率、自动对焦 支持(1.5)(iOS11.3) 支持(1.4)
图片扫描 支持(1.5)(iOS11.3) 支持(1.2)
云锚点 支持(2.0)(iOS12) 支持(1.2)

ARCore API架构梳理

ARCore SDK模块设计易于理解,开发者可以很简单地找到相应的API,简单列了一张重要/常用API的对应概念:

Session: 负责整个AR算法的生命周期和算法配置文件选项,主要有Start\\Pause\\Resume\\Stop,配置文件可配置是否开启位置追踪、2D图片识别、环境光检测等功能,多余的配置涉及到可观的性能开销,并且在切换配置的过程中会涉及到相机画面的重启,建议产品根据各自情况进行选择。

运动追踪相关

Frame.CameraImage.Texture Frame.CameraImage.DisplayUvCoords 相机纹理ID,对应于OpenGL中一张Texture中的Gluint,注意此Texture为一张旋转的External OES Texture,必须搭配DisplayUvCoords信息才能正确渲染(OES Texture与普通纹理有所区别,下文会举例一个实战issue)
Frame.CameraBuffer.AcquireCameraImageBytes 可获得Camera的原始相机数据,格式为YUV420_888,此格式为Android Camera2的默认格式(注意此格式将YUV分离为3个Stride,与Camera1的NV21有所不同)。获得原始数据一般用于进一步的图像处理或CV算法
Frame.Pose.position Frame.Pose.rotation 包含了运动追踪的结构体,包括相机当前位置、旋转等

环境理解相关

Session.GetTrackable 可以获得已经被AR算法重建的平面
Frame.Raycast 从三维世界一个点沿一个方向发射出一条无限长的射线,在射线的方向上,一旦与现实世界的特征点、平面产生碰撞,则返回碰撞对象包含的位置、方向及其他相关属性

光估计相关

ARCore兼容性及解决方案

目前ARCore支持的机型主要为17年、18年发布的旗舰机,下图列了支持的国内主流设备列表,观察到表中支持的设备主要为高通芯片和ARM芯片,据官方所述后续还会支持联发科芯片的机型。

OEM Model
小米 Mi Mix 2S, Mi Mix 3 Mi 8, Mi 8 SE
华为 Honor 10, Honor Magic 2, Maimang 7 Mate 20, Mate 20 Pro, Mate 20 X nova 3, nava 3i P20, P20 Pro Porsche Design Mate RS Porsche Design Mate 20 RS
三星 Galaxy Note9 Galaxy S9, Galaxy S9+

值得一提的是Google官方考虑到国内用户无法在Google Play安装/更新ARCore Runtime,提供了小米、华为和三星应用商店作为国内安装跳转链接。

用于保证机型覆盖率,我们选用了网易的InsightSDK 作为ARCore的fallback的方案,开发的时候可以通过官网的ARCore设备白名单或者Session.CheckApkAvailability的方式进行自动选择SDK。

开发者可能会遇到的问题

1. 运动中做运动跟踪

例如,如果用户是在火车上使用ARCore,这时IMU(Inertial Measurement Unit)获取的数据不仅包括用户的移动(实际是加速度),也包括火车的移动数据(实际是加速度),这样将导致跟踪失败。

2. 跟踪动态的环境

例如,如果用户对着一面大白墙、波光粼粼的湖面,这时从摄像机获取到的图像信息是不稳定的,这将导致特征点提取出错进而导致跟踪失败。

3. 热飘移

相机与 IMU 都是对温度敏感的元器件,之前我们说过相机和IMU的OEM校准,但这个校准通常都会在某一个或者几个特定温度下进行,但在用户设备使用过程中,随着时长的延长会导致设备发热,发热就会影响到相机获取的图像的颜色信息和IMU测量的加速度信息准确性,表现出来就是跟踪的物体会飘移。

4. CPU抢占

从上面的ARCore算法中发现AR算法对CPU要求较高。如果你的App占用了过多的CPU,依然会导致ARCore的效果不稳。可以使用类似SnapDragon Profiler的工具进行一个性能排查。

5. 使用Linear渲染模式

为了追求正确的光照计算,我们使用了Linear渲染模式,但是ARCore并没有提供Linear模式下相关的shader。可以使用以下函数对颜色空间进行转换:

pow(gl_FragColor.rgb,vec3(2.2));

6. External OES Texture的特殊性

将Camera Texture渲染到屏幕的shader使用的是External OES Texture,在实际的使用过程中发现单独使用External OES Texture没有问题,但是结合一张正常Texture会渲染成黑色,经过排查问题发现External OES Texture的底层实现是多个单通道Texture的打包,所以在External OES Texture之后Bind的正常GLuint可能会错误的绑定,这个时候可以将External OES Texture放在最后即可解决。

7. 结合计算机视觉

因为需要将Camera的相机数据做进一步数字图像处理或者CV检测,除了直接获得TextureID,还需要获得相机Buffer,但是小米手机调用Frame.acquireCameraImage() API会抛出NotYetAvailableException,官方文档有在小米的手机上说明这个问题,所以使用这个API还不能做到完全统一兼容。

总的来说,尽管ARCore推出的时间较ARKit迟,但功能上基本与ARKit持平。并且回顾ARCore近一年的发展上看,ARCore也在率先提出一些行业标准,像Cloud Anchor这样的新feature就是由ARCore率先提出,由此可见Google对ARCore的投入和在AR领域决心。同样,社交化的应用方式也是AR技术落地的重要场景。预计未来几年AR的开发生态会逐步完善并标准化,对开发者来说是十分值得期待的。

本文作者:邓志鹏,网易人工智能事业部资深技术美术专家,《Unity5.x从入门到精通》作者之一,主要关注于将AI、AR等前沿技术用于图形、交互领域。

转载地址:http://veynx.baihongyu.com/

你可能感兴趣的文章
一键测试脚本bench.sh
查看>>
结合explain extended浅析使用mysql in 的效率
查看>>
常用的SQL语句
查看>>
线程池学习
查看>>
MFC非模态对话框教程相关
查看>>
Hadoop文件写入详细剖析(22)
查看>>
QuestionAnsweringSystem v1.1 发布,人机问答系统
查看>>
java.lang.Integer$IntegerCache
查看>>
set_exception_handler() 函数设置用户自定义的异常处理函数。
查看>>
测试pypcap的代码(环境:Windows, Python2.7)
查看>>
正则表达式元素:量词介绍
查看>>
intellij idea下用maven安装ssm修改setting.xml的文件位置
查看>>
Windows 7及以上操作系统无法访问网络位置的问题
查看>>
Windows下 .rtf 批量转换 .doc
查看>>
MySQL: Can’t create table **** (errno: 121)的解决方法
查看>>
帝国CMS 7 搜索关键词高亮处理
查看>>
组合,聚合,关联,依赖,实现,泛化 ---UML关系
查看>>
COMMAND 模式
查看>>
Activiti使用maven alfresco仓库问题处理
查看>>
新开源时代iMatrix平台版本也在升级
查看>>