ARUnity Document

项目直达 : ARUnity

关于

ARUnity是用Unity来实现增强现实(Augmented Reality)的简单框架。本框架面向AR初学者,对AR感兴趣并想了解其原理的同学们。框架目前仅支持标记识别,win32 x86平台,标定系统待完成,摄像机内参使用默认的参数。麻雀虽小,但五脏俱全。下一步计划是完善框架->加入自然识别(Natural Feature Tracking)->融合IMU->加入SLAM。

现况与展望

在这个领域,目前世界上商用效果最好的当属高通的Vuforia SDK(被PTC收购),其次是Metaio SDK(被Apple收购)。当然国内也有几家SDK公司,我所了解的真正掌握源代码的公司有亮风台(NFT,QQ AR采用该公司SDK)、EasyAR(IMU+NFT),VoidAR(NFT+PTAMM),这三个公司的SDK全部基于OpenCV编写,不要问我为什么知道这些公司的细节,其实反编译一下就能看出来[滑稽]。最近比较火的游戏《口袋妖怪》是采用GPS+IMU的技术。虽然AR表面上很热,但其实目前发展其实并不乐观,国内唯一能找到盈利点的AR应用当属AR涂涂乐(采用Vuforia SDK所开发)了,其实大部分开发者都处于十分茫然的状态。AR未来的发展方向将会是深度学习+SLAM,越来越依靠GPU、专用算法芯片和相关传感器。未来若干年这几个领域都是热门的研究方向,各大公司也亟需这样的人才。加油吧,各位!

简述

预备知识

  1. OpenCV
  2. Unity基础
  3. 计算机视觉基础
  4. OpenGL基础

开发语言

C++ C#

软件版本

  1. OpenCV(32-bit,github最新代码编译)
  2. Unity 5.4.0f3 (32-bit)
  3. Visual Studio 2013

使用方法

  1. 下载: git clone https://github.com/liu-wenwu/ARUnity.git
  2. 使用Visual Studio 2013打开工程文件Plugins/win32/arunity.sln
  3. 配置工程 x86 & release,编译成功将生成Unity插件Plugins/win32/bin/x86/arunity.dll,拷贝该文件到文件夹 Unity/ARUnity/Assets/Plugins/x86
  4. 子项目 test 用来测试算法和接口,可以打开运行.
  5. 打开 Unity 5.4.0f3 (32-bit),点击 OPEN,选择项目文件夹 Unity/ARUnity
  6. 在Unity项目文件管理器中打开场景文件test.unity
  7. 确保电脑连接有摄像头.点击play按钮,将打印好的标记放在摄像头的场景中,然后我们会发现一个方块“站在”标记上.

Unity开发

ARUnityControllor (唯一必须,可配置)

ARUnity控制器,控制算法的启动、停止和参数配置。目前可设置的参数:

  1. DICT : 标记使用的词典,共有17种。命令规则:DICT_位长度_个数,例DICT_5x5_50表示该词典的标记的长度是5x5 bits,共包含50个单词,单词id的范围是[0,50)。其中DICT_ARUCO_ORIGINAL是5x5 bits,1024 markers。
DICT_4X4_50 = 0,
DICT_4X4_100,
DICT_4X4_250,
DICT_4X4_1000,
DICT_5X5_50,
DICT_5X5_100,
DICT_5X5_250,
DICT_5X5_1000,
DICT_6X6_50,
DICT_6X6_100,
DICT_6X6_250,
DICT_6X6_1000,
DICT_7X7_50,
DICT_7X7_100,
DICT_7X7_250,
DICT_7X7_1000,
DICT_ARUCO_ORIGINAL

VideoQuad (唯一必须,不可配置)

相机背景渲染器,从插件中获得相机每帧的数据并渲染。Shader采用自定义的VideoPlaneNoLight,以此去掉光照和阴影的效果。

VideoCamera (唯一必须,不可配置)

相机背景的Unity照相机,正交投影,深度为0,Culling Mask为0(仅第0层对该相机可见),这里参数设置为相机背景始终适应屏幕尺寸。

ARCamera (唯一必须,不可配置)

AR场景的Unity照相机,透视投影,深度为1(必须保证大于VideoCamera),Culling Mask为Mixed(ARMarker及子物价应放在这里可见的 层),为了和Unity场景一致,这里在OpenGL投影矩阵上,绕X轴顺时针旋转90°,所以对应的模型矩阵也要做同样的旋转。

★ARMarker (可多个,id不能重复,可配置)

每个唯一标记对应的组件,这个组件的子物价将会增强到对应的现实标记上,固定配置为绕X旋转90°,Scale设为1,位置可任意。例子中子物件是Scale为0.5的方块,在ARMarker的中心,这种比例位置关系在运行时不变。目前可设置的参数:

  1. id 标记的ID,范围在 0~词典的单词数-1.
  2. length 标记的物理尺寸,单位m,和标定系统搭配食用。在使用默认内参时,可随意设置一个合适的值,保证在投影范围内即可。
  3. use backgroud color 使用纯色还是标记图片作为marker的平面背景。
  4. backgroud color 当3被选中时,设置marker背景的颜色。

算法开发

本框架目前仅实现了标记的增强现实,可以在此基础上开发其他的AR算法,而不用关心CV矩阵到Unity矩阵的变换,以及其他到Unity的转换工作。程序结构图如下:
程序结构图

待补充。。。

参考文章

OpenGL与OpenCV实现增强现实

坚持原创技术分享,您的支持将鼓励我继续创作!