是时候来点AR

298

原文链接:cloud.tencent.com/developer/a…

首先ar是什么?

简单的来港,ar就是增强现实技术,它是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,是把原本在现实世界的一定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),通过电脑等科学技术,模拟仿真后再叠加,将虚拟的信息应用到真实世界,被人类感官所感知,从而达到超越现实的感官体验。真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。

那么arcore,就好理解了,嗯,是某个为ar开发而实现的sdk,事实上ARCore 为许多最受欢迎的开发环境提供了 SDK。 这些 SDK 为运动跟踪、环境理解和光估测等所有必需 AR 功能提供了原生 API。 您可以利用这些功能构建全新的 AR 体验,或通过 AR 功能增强现有应用。

说的这么好听,来点实际的,搞一个demo看看。

添加了一个虚拟的狮子

如上图所示,这个狮子明显不是真实世界的动物,对比之下,这个狗狗就是真实世界中的事物了,那么言外之意就是这个狮子的引入,增强了你对这个真实世界的感官,不是吗?

一、如何一步步来搞起ar

1、首先,你需要将你的android studio升级到3.1

2、其次,如果你想在真机调试的话,(废话,不用真机,你如何拿去给你的小伙伴装逼),你需要保证你的机器在一下机型之中->支持的设备

如果不在,你将退而求其次,使用模拟器也是可以玩的。

二,sdk的导入及xml文件的配置

1,xml文件的配置,很明显摄像头权限是必不可少的,其次还需要一个meta-data,value取值可选必须,这个值依据与你的应用是否必须启用arcore,通常我们选择可选

<!-- AR Optional apps must declare minSdkVersion ≥ 14 -->
<uses-sdk android:minSdkVersion="14" />

<uses-permission android:name="android.permission.CAMERA" />
…

<application>
    <meta-data android:name="com.google.ar.core" android:value="optional" />
    …
</application>

2、build.gradle修改

android {
    …
    defaultConfig {
        // Sceneform requires minSdkVersion >= 24.
        minSdkVersion 24
        …
    }
    // Sceneform libraries use language constructs from Java 8.
    // Add these compile options if targeting minSdkVersion < 26.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    …
    // Provides ARCore Session and related resources.
    implementation 'com.google.ar:core:1.7.0'

    // Provides ArFragment, and other UX resources.
    implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.7.0'

    // Alternatively, use ArSceneView without the UX dependency.
    implementation 'com.google.ar.sceneform:core:1.7.0'
}

注意,必须要java8.0才可以跑起来,因为arcore依赖了java8的一些特性,否则会编译失败。

三,开始装逼

1、图像增强

这里官方给到了一个例子,就是一个地球图片:

demo

在这个demo中,他们用这个地球图片构建了一个数据库,这个构建工具是arcoreimg,简单的比方就是这个工具会提取这张图片的特征信息,然后将其存放在数据库中。

好了,数据库构建好之后,启动app,摄像头去扫描这张图片,随后,这张图片就被捕捉到了,然后就接下来就是给图片四周加了个相框。效果如下所示:

找到图像并且给这张图像加了相框

好了,官方的demo给我们展示了图像增强的一个demo效果就是如此的,请注意,这个过程是离线的,并不需要联网完成。

那么,这个捕捉图像的过程是怎么做的,我们一步步来分析:

  • 数据库的创建

数据库创建是使用arcoreimg这个工具创建的,命令:

./arcoreimg build-db --input_images_directory=/path/to/images \
                       --output_db_path=/path/to/myimages.imgdb

具体的可以看链接介绍,使用起来非常方便,但是任然需要注意两点;

  1. 图像的评分很重要,Google建议使用得分至少为 75的图像。怎么测评得分,相信你可以轻松在链接中找到。
  2. 每个图像数据库可以存储最多 1000 张参考图像的特征点信息
  3. 图像的分辨率至少应为 300 x 300 像素

更多的注意事项请参考这里。以上只是我实验的过程中遇到的问题,恰好碰到的点。

当然,你完全可以在现有的图像数据库的基础上添加一个新的图像数据:

Bitmap bitmap;
try (InputStream inputStream = getAssets().open("dog.jpg")) {
  bitmap = BitmapFactory.decodeStream(inputStream);
} catch (IOException e) {
  Log.e(TAG, "I/O exception loading augmented image bitmap.", e);
}
int index = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);
  • 图像追踪

在demo中,我们可以看到这样一句代码,他的意思就是把我们的数据库和ar session相关联起来。

config.setAugmentedImageDatabase(imageDatabase);
session.configure(config);

那么,我们不禁也 要问一问,这个ar session是什么呢,毫无疑问,最简单的方式,莫过于看源码了,以下就是创建session的全过程,这个是BaseArFragment中的一个片段。可以看到他封装了权限的检查,arcore环境的检查,所以,Google建议先手使用ArFragment来玩arcore,这样会简单点,你也只需要关心自己的业务逻辑,神马权限检查,可用性检查都统统交给他来做。

创建session

好,session和特征图像数据库挂钩之后:

ARCore 通过将摄像头图像中的特征点匹配图像数据库中的特征点来寻找图像,

每一帧去检查有没有新的augmentImage,PAUSED表示发现了一个augmentImage,接下来的帧会不停跟踪这个augmentImage,比如此时你就可以给scene中添加相框了,添加相框也要相对一个augmentImage,嗯,就是你此时监测到的augmentImage,可以看看代码,相框是怎么添加的

你会发现,你把摄像图移开,然后等会移过去,即便那个图像不在了,相框依然在哪里,好像是记住了那个空间位置一样,这是为什么呢?

答案是:云锚点,我猜的,哈哈~~,因为我目前只能找到这个解释,单肯定不准,因为这里似乎并没有将这个上图红线的位置交给云吧,充其量只能算是伪云锚点,本地的空间位置信息应该是有的。

四,至此,这个图像增强的案例算是已经玩通玩懂了,基于这个点,你能玩写什么花样呢?

我这里将下我自己的一个应用吧,算是给自己学习的一个交代:

我做了一个扫王者荣耀英雄查攻略的app,具体实施的步骤是:

1、到官网去把英雄的图片都下载下来,我使用的是爬虫,因为还是有点多的,代码就懒得给了,不难,网上也有一大堆爬网站图片的,略微改改即可。

2、使用arcoreimg工具将这些英雄图片构建成数据库,在构建之前,你可以用arcoreimg检查下图片质量,发现,会报错,因为你违背了,图片至少300*300像素的规则,怎么办,当然是借助工具进行图片放大了,我用的工具是photozoom,mac试用版,有水印,略不爽,但是能用。

3、我们发现生成数据库的同时,会生成一个

在结合这个index

我们就轻易的知道了,目前扫到的是哪个英雄了,拿到则个id,就可以去查这个英雄的攻略啦~~