是时候来点AR

原文链接: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,就可以去查这个英雄的攻略啦~~


转载于:https://juejin.im/post/5c88bf276fb9a049ea39cdc1

<think>嗯,用户之前问过关于编译系统中`cc`的问题,现在又在问`ar`是什么。看起来他们对Linux下的编译工具链感兴趣,可能是在学习如何编译项目或者理解构建过程。 首先,`ar`的全称是Archiver,需要解释清楚它的基本功能是打包目标文件成静态库。用户可能对静态库和动态库的区别不太清楚,需要简要说明两者的不同,但重点放在静态库上。 用户可能在使用Makefile或者手动编译时遇到了`ar`命令,所以需要给出实际的使用例子,比如如何创建库,如何添加或替换文件。这些例子能帮助他们更好地理解如何使用这个工具。 另外,可能需要提到`ar`在构建过程中的作用,特别是在生成静态库时的步骤,比如先编译成.o文件,再用`ar`打包。结合之前的`cc`问题,可以强调编译器和归档工具在构建流程中的协作。 用户可能还想知道常见参数的含义,比如`r`、`c`、`s`等,以及如何查看库中的内容。这时候需要用简单的命令示例来说明,比如`ar -t libxxx.a`来列出文件。 另外,`ar`和动态库工具如`gcc -shared`的区别也很重要,指出静态库和动态库在链接时的不同处理方式,这样用户能理解为什么在某些情况下用`ar`而其他情况用不同的命令。 还要注意用户可能对工具链的其他部分不太熟悉,比如`ranlib`,但需要说明现代`ar`的`s`参数已经替代了`ranlib`,避免他们混淆。 最后,总结`ar`的作用,并关联到之前的`cc`,强调两者在编译流程中的不同角色,这样用户能有一个整体的认识。</think>在 Linux 编译过程中,`ar` 是 **静态库归档工具(Archiver)**,用于创建、修改和提取静态库文件(`.a` 文件)。以下是详细解释: --- ### **1. 基本功能** - **核心作用**:将多个目标文件(`.o` 文件)打包成 **单个静态库文件**(`.a` 文件)。 - **类比理解**:类似 ZIP 压缩文件将多个文件合并为一个,但 `ar` 专门用于编译场景的二进制文件整合。 - **典型用途**:构建静态库供其他程序链接使用(如 `libmath.a`)。 --- ### **2. 常见操作示例** #### **创建静态库** ```bash # 1. 编译生成目标文件(.o) gcc -c add.c sub.c # 2. 用 ar 打包成静态库(rcs 参数解释见下文) ar rcs libmath.a add.o sub.o ``` - 生成 `libmath.a` 静态库,包含 `add.o` 和 `sub.o`。 #### **查看静态库内容** ```bash ar -t libmath.a # 输出:add.o sub.o ``` #### **替换库中的目标文件** ```bash ar r libmath.a new_add.o # 若库中已有 add.o,会替换为 new_add.o ``` --- ### **3. 关键参数说明** | 参数 | 含义 | |------|--------------------------------------------------------------------| | `r` | **替换(Replace)**:将文件插入库,若同名则覆盖 | | `c` | **创建(Create)**:若库不存在则新建,不显示警告 | | `s` | **索引(Index)**:生成符号表(等同于 `ranlib` 命令,现代 `ar` 已自动处理) | | `v` | **详细模式(Verbose)**:显示操作过程 | | `d` | **删除(Delete)**:从库中移除指定文件,如 `ar d libmath.a sub.o` | --- ### **4. 在构建流程中的作用** 静态库的典型构建步骤: ```bash # 1. 编译源码生成目标文件 gcc -c src/*.c # 2. 打包目标文件为静态库 ar rcs libmylib.a *.o # 3. 其他程序链接该静态库 gcc main.c -L. -lmylib -o program ``` --- ### **5. 与动态库工具的区别** | 工具/文件类型 | 静态库(`.a`) | 动态库(`.so`) | |------------------|------------------------------|-----------------------------| | **生成工具** | `ar` | `gcc -shared` | | **链接方式** | 编译时直接嵌入到可执行文件 | 运行时动态加载 | | **文件体积** | 较大(包含所有代码) | 较小(共享代码) | | **更新影响** | 需重新编译主程序 | 替换 `.so` 文件即可生效 | --- ### **总结** - `ar` 是 Linux 编译工具链中 **管理静态库的核心工具**。 - 通过 `ar` 打包的静态库(`.a` 文件)会被直接链接到最终的可执行文件中。 - 若需要动态库(运行时加载),需使用 `gcc -shared` 生成 `.so` 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值