【AR】AR库的准备工作和基本流程

来源:互联网 发布:ue sql格式化 编辑:程序博客网 时间:2024/05/09 20:02

最近准备开始做一个比较复杂的项目——写一个自己的AR库,准备工作已经做了有几周了,AR的大概流程已经梳理了几遍。下面先简单说明一下AR是什么:

AR是Augmented Reality的缩写,中文翻译为现实增强(扩增实境)。它是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。最早在1990年提出。

目的

写这个博客最主要的原因就是因为网上关于AR方面的东西太少,所以我决定在这里梳理一下学习AR所需要的技术基础和可实现的环境(由于我自己也是第一次做AR相关的东西,所以我不敢保证自己所说的都是对的,但希望可以给大家一个机会去更好的入门,或者说,为入门做准备),让大家可以更好的找到方向,因为当时刚开始涉猎这个方向的时候,我也是在很多地方找了很久资料才确定下方向的。

基础

  • 掌握基本的数字图像原理和基础(数字图像的储存机制、数字图像的基本概念等)
  • 对基本数字图象处理的方法和作用熟练掌握
  • 对至少一个图像处理库进行过研究(OpenCv、OpenGL等),并且能够熟练使用其中的数据结构和常用的函数
  • 能够抽象地理解数字图像的处理和储存机制,并且能够进行一定改进(因为AR要求比较好的实时性,用自带的函数库有时候并不能很好地解决速率问题,这时候我们可能需要对部分库函数进行重写,来对这些特定的处理写特定的处理方案,提高效率)
  • 至少能熟练使用一门高级语言(C++、java等)
  • 掌握基本的数据结构基础
  • 至少有一点线性代数的基础(知道矩阵和矩阵的各种运算)

流程和原理

原理

简单地来说,就是对摄像头捕捉到的帧图片(frame)进行图像识别,获取你的特征物体(或则说特征图片块,因为这个图片物体也许经过了旋转,大小和角度的改变)的位置、旋转角度、大小变化等信息,然后将3D模型根据这些信息做一定的变换后放置在特征图片的法向量上。

流程

大致的流程就是这样
具体的流程在当时研究现在流行的easyAR和github上的一个AR项目的时候大致梳理了一下(可能当时写的有一些似是而非和草率,不要介意,以下是基于我当时使用的opencv库),现在再进行一点修改,AR识别的大致流程如下:

  1. 从摄像头中获取一帧图片
  2. 将帧图片转换成灰度图(便于特征点的抓取,提高opencv的特征点抓取算法的效率)
  3. 抓取灰度图中的特征点(feature points),通过opencv自带的特征点抓取算法实现(自己虽然也能写特征点抓取的算法,但是效率差距过大,准备在项目后期将opencv的算法都自己实现一下,进行一点对AR识别方面的特定优化)。
  4. 将特征点的信息存储(为后面的算法做准备)
  5. 将摄像头中取得的帧图像比对需要抓取的特征图像
  6. 通过特征点群对特征图像和摄像读取的帧图像之间进行比对
  7. 通过特征点匹配算法,获得特征图像的大致矩形,将抓取得到的帧图像中的特征图片(可能发生大小、角度等变化)和原特征图像之间建立起准确的映射
  8. 将上一步的映射关系抽象成一个向量矩阵(通过这个映射向量矩阵可以得出抓取的特征图像相对于原特征图像之间的大小、角度等方面的改变)
    PS:当然如果每一帧都通过以上的算法,势必会导致效率不够帧率降低
  9. 在这里为了提高效率,这里会保存上一帧得到的灰度图信息,然后用光流金字塔特征跟踪算法进行特征点的跟踪。(光流和仿射变换矩阵在最高一层的图像上计算出,将上一层的计算结果作为初始值传递给下一层图像,这一层的图像在这个初始值的基础上,计算这一层的光流和仿射变化矩阵;再将这一层的光流和仿射矩阵作为初始值传递给下一层图像,直到传递给最后一层,即原始图像层,这一层计算出来的光流和仿射变换矩阵作为最后的光流和仿射变换矩阵的结果)
  10. 因为我们的摄像头一般是固定不动的,所以背景的特征点一般是不会改变的,而移动的物体身上所带的特征点较少,每次都执行全图特征点获取以及比对算法的话,虽然自带的算法效率不错,但由于还要执行模型的绘制,光照的渲染,在这一步所耗费的时间就很宝贵。
  11. 执行这个算法可以很好的跟踪特征点的移动,并且减少了重复的特征点计算,使运算量大大减小,在这个算法中,我们通过递归将很大的像素偏移转换成几个很小的像素偏移(假设光流在像素点的邻域是一个常数,然后使用最小二乘法对邻域中的所有像素点求解基本的光流方程,在这里,我们只需要将上一次得到的特征点进行光流比对),通过不断地递归,然后就可以很快得到想在需要抓取的图片的具体方位,提高了运算效率。
  12. 算法原理如图1:越往上,图像分辨率越低,通过递归,不停得到一个大致的范围,然后在最后一层,获得上一图像特定特征点在下一图像中的偏移,然后直接确定在现图像中的位置,多个特征点的匹配,然后得到需要抓取的图片位置。减少了很多工作
  13. 通过以上的算法,我们可以在肉眼无法识别的延迟下得到帧图像中是否存在指定抓取图像,若存在,就将帧图像中的被抓取图像相对于原抓取图像的映射矩阵算出,这样我们就相当于间接得到了帧图像中的被抓取图像的大小、方位和旋转角度等信息。
  14. 通过以上得到的映射矩阵,我们再通过openGL(或则其他的任何工具)的三维模型处理算法,在帧图像的被抓取图片位置生成旋转角度、大小等数据和被抓取到的特征图片相配的3D动态模型,然后再加上光线的渲染,整个AR的流程差不多就是这样。(如果还要再加上动态效果,也不是很难)

图一

总结

大致流程已经梳理了一遍,在此之前,我先说明一下我现在写代码的基本配置情况(OpenGL还未配置):

 - VS 2013 - OpenCv 2.3.1

由于以前用的是OpenCv 1.x 版本,在更新到2.x 之后进行了很多对新特性的测试,希望大家在学习之前也先对OpenCV 进行一定的了解

大致情况就是就是这样,我会在这个暑假慢慢地写自己的进度和自己的想法,希望有这方面兴趣的能够一起讨论