原文连接:cloud.tencent.com/developer/a…html
首先ar是什么?java
简单的来港,ar就是加强现实技术,它是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,是把本来在现实世界的必定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),经过电脑等科学技术,模拟仿真后再叠加,将虚拟的信息应用到真实世界,被人类感官所感知,从而达到超越现实的感官体验。真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。android
那么arcore,就好理解了,嗯,是某个为ar开发而实现的sdk,事实上ARCore 为许多最受欢迎的开发环境提供了 SDK。 这些 SDK 为运动跟踪、环境理解和光估测等全部必需 AR 功能提供了原生 API。 您能够利用这些功能构建全新的 AR 体验,或经过 AR 功能加强现有应用。web
说的这么好听,来点实际的,搞一个demo看看。数据库
如上图所示,这个狮子明显不是真实世界的动物,对比之下,这个狗狗就是真实世界中的事物了,那么言外之意就是这个狮子的引入,加强了你对这个真实世界的感官,不是吗?bash
一、首先,你须要将你的android studio升级到3.1session
二、其次,若是你想在真机调试的话,(废话,不用真机,你如何拿去给你的小伙伴装逼),你须要保证你的机器在一下机型之中->支持的设备app
若是不在,你将退而求其次,使用模拟器也是能够玩的。ide
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>复制代码
二、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的一些特性,不然会编译失败。
一、图像加强
这里官方给到了一个例子,就是一个地球图片:
在这个demo中,他们用这个地球图片构建了一个数据库,这个构建工具是arcoreimg,简单的比方就是这个工具会提取这张图片的特征信息,而后将其存放在数据库中。
好了,数据库构建好以后,启动app,摄像头去扫描这张图片,随后,这张图片就被捕捉到了,而后就接下来就是给图片四周加了个相框。效果以下所示:
好了,官方的demo给咱们展现了图像加强的一个demo效果就是如此的,请注意,这个过程是离线的,并不须要联网完成。
那么,这个捕捉图像的过程是怎么作的,咱们一步步来分析:
数据库建立是使用arcoreimg这个工具建立的,命令:
./arcoreimg build-db --input_images_directory=/path/to/images \
--output_db_path=/path/to/myimages.imgdb复制代码
具体的能够看连接介绍,使用起来很是方便,可是任然须要注意两点;
更多的注意事项请参考这里。以上只是我实验的过程当中遇到的问题,刚好碰到的点。
固然,你彻底能够在现有的图像数据库的基础上添加一个新的图像数据:
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和特征图像数据库挂钩以后:
ARCore 经过将摄像头图像中的特征点匹配图像数据库中的特征点来寻找图像,
每一帧去检查有没有新的augmentImage,PAUSED表示发现了一个augmentImage,接下来的帧会不停跟踪这个augmentImage,好比此时你就能够给scene中添加相框了,添加相框也要相对一个augmentImage,嗯,就是你此时监测到的augmentImage,能够看看代码,相框是怎么添加的
你会发现,你把摄像图移开,而后等会移过去,即使那个图像不在了,相框依然在哪里,好像是记住了那个空间位置同样,这是为何呢?
答案是:云锚点,我猜的,哈哈~~,由于我目前只能找到这个解释,单确定不许,由于这里彷佛并无将这个上图红线的位置交给云吧,充其量只能算是伪云锚点,本地的空间位置信息应该是有的。
我这里将下我本身的一个应用吧,算是给本身学习的一个交代:
我作了一个扫王者荣耀英雄查攻略的app,具体实施的步骤是:
一、到官网去把英雄的图片都下载下来,我使用的是爬虫,由于仍是有点多的,代码就懒得给了,不难,网上也有一大堆爬网站图片的,略微改改便可。
二、使用arcoreimg工具将这些英雄图片构建成数据库,在构建以前,你能够用arcoreimg检查下图片质量,发现,会报错,由于你违背了,图片至少300*300像素的规则,怎么办,固然是借助工具进行图片放大了,我用的工具是photozoom,mac试用版,有水印,略不爽,可是能用。
三、咱们发现生成数据库的同时,会生成一个
在结合这个index
咱们就轻易的知道了,目前扫到的是哪一个英雄了,拿到则个id,就能够去查这个英雄的攻略啦~~