# 手机中的 AR 小应用究竟是如何实现的？

- 作者：ARinChina 增强现实中国
- 发布时间：2016-10-08 09:37
- 分类：新创
- 原文：https://www.ifanr.com/727117

![girl drinking milk at the kitchen](https://s3.ifanr.com/wp-content/uploads/2016/10/milk2-1024x640.jpg)

> 本文由 ARinChina（[www.arinchina.com](http://www.arinchina.com/)）原创，转载请联系 ARinChina（微信 ID：arinchinaservice）

农场中一头奶牛悠闲地吃着草，一个卡通小人儿在和消费者聊着天。出现这一切，都源于一个简单的牛奶瓶。消费者通过手机或平板扫描牛奶瓶身上的图案，就会呈现一个虚拟农场，可以选择各种小动物，并和它们进行互动。

[嵌入内容](http://v.qq.com/iframe/player.html?vid=v0188n704i2&tiny=0&auto=0)
荷兰飞天农场的 AR 营销活动，（[腾讯视频](http://v.qq.com/x/page/v0188n704i2.html)）

这种深受孩子喜爱的宣传方式是怎么实现的呢？其实这个过程只需要六步：

1. 通过摄像头采集实时视频；
2. 将采集到的视频流数字化成图像，然后通过上文的特征点检测、特征点描述子生成、特征点匹配一系列处理，找到识别标识物；
3. 识别出标识物后，以标识物作为参考，确定要生成的动画在 AR 环境中的位置和方向，并确定提前存入手机中的标识图位置；
4. 标识物中的标识符号与预设的目标图进行匹配；
5. 程序根据标识物位置调整动画（虚拟信息）位置；
6. 动画（虚拟信息）被渲染进视频流。

这就是 AR 的实现过程，今天将为大家解释六步中的“精华”——识别并跟踪标识物。

### 牛奶瓶上的特点

当消费者拿起手机扫描牛奶瓶时，手机是怎么判断这幅图是不是自己要找的目标呢？

![1020457411982](https://s3.ifanr.com/wp-content/uploads/2016/10/1020457411982.jpg)

目标图是在开发这款 AR 应用时提前读入 app 的。启动 app 后，它就开始查找与标识图相同的帧。

这就像警察在抓逃犯时，会在各交通要道设立排查点，将过往行人与逃犯照片进行对比，进行排查。警察在比对照片时，不会每根头发，每个毛孔都要进行比较。他们会关注嫌疑人的一些显著外貌特征，与这些特征相似度极高的人视为犯罪嫌疑人。

![1021123511982](https://s3.ifanr.com/wp-content/uploads/2016/10/1021123511982.jpg)

同理，图像识别中的目标图也具有特征，我们将这些特征称为“特征点”。

### 那么问题来了，如何找到这些点？

图像在电子设备中的状态是一堆数字。特征点就是那些和周围数字值相差较大的点，检测方法一般有：FAST、Harris、SIFT、SURF、MSER 等。

![1021599611982](https://s3.ifanr.com/wp-content/uploads/2016/10/1021599611982.png)

FAST 特征点检测法因检测速度快而深受研究者喜爱，具体遵循以下步骤：

首先，从图像中选取一个像素，记作 P。如果我们想判断它是否为一个特征点，首先把 P 点的亮度值记作 I。再设定一个合适的阈值 t，用来控制特征点的选取。以 P 为圆心，3 个像素为半径做圆，这个圆的边界上有 16 个像素，如下图所示：

![1022374011982](https://s3.ifanr.com/wp-content/uploads/2016/10/1022374011982.jpg)

如果这 16 个像素的像素值都比 I+t 大，或都比 I-t 小，那么 P 就是一个特征点。一般在实际检测中，这 16 个像素不用全部与 P 的亮度值进行比较，只要有 3/4 个以上的像素亮度值比 P+t 大或比 P-t 小，就可以认为 P 点为特征点。

简单来说，特征点就是与周围反差较大的点，就像下图所示：

![1023111511982](https://s3.ifanr.com/wp-content/uploads/2016/10/1023111511982.jpg)

### 找到特征点就可以识别了么？

只知道检测到特征点还不行，必须知道两张图像中的特征是否一致。如何判断特征点是否一致，就需要借助特征点描述子了。

特征点描述子是一种描述特征点的方法。比如，我们在挑西瓜时，会选根蒂蜷缩、敲起来声音浊响的青绿西瓜。这个挑瓜的过程就是描述的过程，挑瓜的依据就相当于生成的描述子。

![1023521511982](https://s3.ifanr.com/wp-content/uploads/2016/10/1023521511982.jpg)

如果一个瓜和我们的挑瓜条件相似或相同，那么我们就判断它是一个好瓜。同样的如果一幅图像中有一个点和我们的描述子相似或相同，那么就可以判断它们为同一特征。

找到了特征点描述子，接下来就是要在目标图和识别图之间进行匹配。

![1024211011982](https://s3.ifanr.com/wp-content/uploads/2016/10/1024211011982.jpg)

判断两幅图是否为同一幅图的标准是人为控制的。我们既可以设置匹配率为 10% 以上的两幅图像是同一图像，也可以设置匹配率为 90% 以上。具体标准根据应用所需而定。

目前，特征点匹配技术大概分为两类：一类是分别获取两幅图像的特征点及特征点描述子，根据一定的搜索策略对这些特征点和描述子进行计算，最终获得最优极值点即为匹配结果；另一类是只获取参考帧图像的特征点信息，并利用它在当前帧上寻找最优匹配，这种匹配的最大优点是只需提取参考帧的特征点，节约了一半的特征点提取时间。

### 发现目标要盯紧

从文章开头的视频中可以看到，当小孩拿着 iPad 转动时，生成的动画会保持不动。给我们一种“动画和牛奶是一个整体”的错觉。要想达到这种效果，需要对视频流中的图像进行特征点跟踪。

特征跟踪有两种方式，一种是对视频流中的每一帧图像，进行特征点匹配。另一种则在第一幅图像中，寻找可能的特征位置，然后在后续的图像中搜索它们的对应位置。显然，这类“先检测后跟踪”的方法适合用在视频跟踪应用中。

![1025073811982](https://s3.ifanr.com/wp-content/uploads/2016/10/1025073811982.jpg)

在跟踪过程中，相邻两帧经过匹配后，得到当前帧的目标特征点。由于得到的目标特征点中存在不稳定特征点，因此需要将这些不稳定的点剔除。

但又出现了一个新的问题，即随着跟踪的进行，有效特征点会逐渐减少。尤其是在跟踪过程中当目标姿态发生了大幅度变化时，经常会出现目标的特征点急剧减少甚至消失的情况，这样会导致跟踪效果不好甚至跟踪失败。

这就像卖水果的小商贩经常会挑出好的水果摆放在最前面，随着客人的购买，再继续往上添加。

解决特征点减少问题的方法和卖水果是一样的。只需扩大范围搜索重新提取特征点，即当前时刻目标物中得到的特征点的个数小于一定的阈值时，扩大跟踪面积重新提取特征点，将重新提取到的特征点用在接下来的跟踪过程中。

![1025406711982](https://s3.ifanr.com/wp-content/uploads/2016/10/1025406711982.jpg)

农场中一头奶牛悠闲地吃着草，一个卡通小人儿在和消费者聊着天。出现这一切，都源于一个简单的牛奶瓶。消费者通过手机或平板扫描牛奶瓶身上的图案，就会呈现一个虚拟农场，可以选择各种小动物，并和它们进行互动。

在跟踪的同时还需要完成一件事情，那就是渲染动画。动画必须和识别图位置保持一致才能达到融合效果。

目前手机端 AR 应用开发多数是采用这种图像法，这种方法已经被模式化。开发者不用考虑上述这些底层实现，可以使用一些插件来实现。常用插件国外的有 Vuforia、Metaio 等，国内有 HiAR、EasyAR、VoidAR 等。

题图来源：[childteaching](http://www.childteaching.com/the-importance-of-milk-for-kids)
