Vuforia开发完全指南---Image Target,简单方便的AR图像识别

概述

在Vuforia提供的SDK中,最简单、也是最常见的AR功能就是Image Target---图像识别。你只需提供一张可识别的图片,将图片移到设备的摄像头下,设备上就能出现之前已经集成进去的虚拟场景,而且可以根据ARCamera的不同模式,让图片和虚拟场景的叠加现象有所不同。这篇文章详细讲解了Vuforia中基于Image Target的AR产品开发流程,学完之后你就能开发出一个基于图片的AR App。

演示Demo

这是笔者做的一个简单的冰与火之歌的AR Demo,基于Vuforia Image Target。

点击观看

视频地址:https://v.qq.com/x/page/k0557z1x02n.html

准备工作

工欲善其事,必先利其器。首先我们要做的是准备好工具,这里采用Unity作为开发工具,演示在iOS设备上,因此还需要Mac系统和Xcode。进行开发的第一步就是要下载Vuforia的SDK,登上Vuforia官网进入开发者平台下载Unity的SDK包,完成之后将package导入到Unity中。然后就要登录License Manager和Target Manager创建App的license,以及上传需要扫描的图片。关于License Manager和Target Manager,已经在之前的教程中详细讲过了,可以参考一下。

Vuforia开发完全指南(三)---License Manager和Target Manager详解

首先是在License Manager中创建license key,然后进入Target Manger创建Database,上传需要扫描的图片。这里在点击Add Target之后选择的类型是Device,然后输入相关参数。上传成功后就可以下载图片SDK,导入到Unity中。

功能开发

  1. 打开Unity工程,在Project面板中找到Vuforia文件夹,将其Prefabs文件夹中的ARCamera拖到Unity场景中,之后删掉场景中之前默认的Camera。
  2. 将Prefabs文件夹中的ImageTarget拖到场景中,这个是Vuforia用来专门进行图像识别的工具。

  3. 点击场景中的ARCamera,在其选项面板中点击“Open Vuforia configuration”,将之前创建的license key复制到“App License Key”输入框中。然后在下面的Datasets中,勾选住之前创建的database以及其“Activate”选项,将database激活。
  4. 点击场景中的ImageTarget,在其选项面板的“Image Target Behaviour”组件中,在Database和Image Target选中对应的名字。
  5. 将想要展现的3D模型拖入到场景中,并将其作为ImageTarget的子物体。这样,已经完成了最简单的AR图像识别,如果你现在编译工程在设备上运行,将识别图放到摄像头取景范围内,模型就能出来了,并随着识别图的位置改变而改变。但是如果想要加入更多的交互功能,就要用代码来控制。
  6. 点击场景中的ImageTarget,在其属性面板中可以看到已经挂了一个脚本“Default Trackable Event Handler”,在这个脚本里我们就能对AR场景中的物体进行控制,当图片被成功识别时做什么,当图片消失时又会做什么。



    在这个脚本中需要关注两个函数:OnTrackingFound()和OnTrackingLost()函数。其中OnTrackingFound会在图片被识别后调用,OnTrackingLost会在被识别的图片从摄像头取景范围内消失后调用。这两个函数的定义如下:
		private void OnTrackingFound()
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Enable rendering:
foreach (Renderer component in rendererComponents)
{
component.enabled = true;
} // Enable colliders:
foreach (Collider component in colliderComponents)
{
component.enabled = true;
} Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
} private void OnTrackingLost()
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Disable rendering:
foreach (Renderer component in rendererComponents)
{
component.enabled = false;
} // Disable colliders:
foreach (Collider component in colliderComponents)
{
component.enabled = false;
} Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}

这两个函数的最后都有一行Debug.Log的打印,里面有mTrackableBehaviour.TrackableName这个变量。这个变量就是之前在Target Manager中上传图片后,导入到图片SDK的图片名字。还记得在上传图片时需要输入的那个名字字符串么?mTrackableBehaviour.TrackableName这个变量就和那个名字字符串是一样的,因此我们可以在代码中利用这个变量来判断是哪张图片被识别,继而控制场景中的物体。

在这个例子中,笔者在场景中加了一个红龙Dragon的模型,还加了一个附带几个按钮的Canvas,用来控制这个红龙的动作。在Default Trackable Event Handler脚本中,将Dragon和Canvas声明为public变量,

public GameObject dragon;
public GameObject canvas;

将场景中的Dragon和Canvas拖入到脚本中的物体框。然后在OnTrackingFound()函数中添加当图像被识

别后,对Dragon和Canvas的控制代码,这里只是简单的让两者出现,注意这里对图片的名字进行了判断,虽说工程中只有这一张图片,但是当需要识别多张图片时,就必须通过ImageTarget中的图像名称来判断识别出的是哪张图片。

if (mTrackableBehaviour.TrackableName == "Dragon")
{
dragon.SetActive(true);
canvas.SetActive(true);
}

同样,在OnTrackingLost()函数中通过对mTrackableBehaviour.TrackableName的判断,来让Dragon和Canvas消失。

if (mTrackableBehaviour.TrackableName == "Dragon")
{
dragon.SetActive(false);
canvas.SetActive(false);
}

Canvas中对Dragon控制的按钮脚本代码就不贴出来了,大家可以通过自己的需求加上很多酷炫和实用的功能。

当代码检查无误后,就能编译工程,拷进设备进行AR体验了。大家可以看到使用Vuforia的Image Target功能,无需很复杂的代码就能做出非常酷炫的AR程序。

Vuforia开发完全指南(四)--- Image Target的更多相关文章

  1. Vuforia开发完全指南---Vuforia概述

    Vuforia概述 AR(Augmented Reality)增强现实,想必大家都已经很熟悉了.这是当下最热的技术之一,是利用计算机视觉和计算机图像学领域的相关知识将虚拟世界融入到现实生活当中.AR和 ...

  2. Vuforia开发完全指南---License Manager和Target Manager详解

    License Manager和Target Manager License Manager 对于每一个用Vuforia开发的AR程序来说,都有一个唯一的license key,在Unity中必须首先 ...

  3. Vuforia开发完全指南---不懂编程也能做AR程序

    不懂编程也能做AR程序 可能一听到要做AR程序,很多人都会想到这是程序员的事.如果不懂编程,不会写代码,是做不了AR程序的.其实,Vuforia的Unity SDK非常人性化,即使你不会编程,也能做出 ...

  4. 【文章内容来自《Android 应用程序开发权威指南》(第四版)】如何设计兼容的用户界面的一些建议(有删改)

    最近一直在看的一本书是<Android 应用程序开发权威指南>(第四版),十分推荐.书中讲到了一些用户界面设计的规范,对于初学者我认为十分有必要,在这里码给大家,希望对我们都有用. 在我们 ...

  5. C#微信公众号开发系列教程四(接收普通消息)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  6. 微信公众账号开发教程(四)自定义菜单(含实例源码)——转自http://www.cnblogs.com/yank/p/3418194.html

    微信公众账号开发教程(四)自定义菜单 请尊重作者版权,如需转载,请标明出处. 应大家强烈要求,将自定义菜单功能课程提前. 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了 ...

  7. Chrome 开发工具指南

    Chrome 开发工具指南 谷歌 Chrome 开发工具,是基于谷歌浏览器内含的一套网页制作和调试工具.开发者工具允许网页开发者深入浏览器和网页应用程序的内部.该工具可以有效地追踪布局问题,设置 Ja ...

  8. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

  9. Visual C++2010开发权威指南 中文高清PDF - VC.NET

    第一部分  Visual C++ 2010开发与新特性第1章  Visual C++ 2010开发环境简介 11.1  Visual C++ 2010简介 11.2  Visual C++ 2010下 ...

随机推荐

  1. hdu2222 Keywords Search(AC自动机初步)

    题目大意: 给出多个模式串和一个主串,求多少个模式串在主串中出现过. 传送门 这是一道AC自动机的模板题. 在学习AC自动机之前,首先要学习WA自动机.TLE自动机和MLE自动机(雾 AC自动机是一种 ...

  2. django文件上传

    -------------------上传图片-------------------1.model中定义属性类型为models.ImageField类型 pic=models.ImageField(u ...

  3. Bootstrap-table使用记录(转)

    HTML代码 /*index.cshtml*/ @section styles{ <style> .main { margin-top:20px; } .modal-body .form- ...

  4. DotNetCore跨平台~Quartz定时单次任务

    之前写过一篇文件<DotNetCore跨平台~Quartz热部署的福音-监控文件夹的变化>,今天主要把框架优化了一下,支持外部触发,并支持外部将参数以JobDataMap形式进行输入,然后 ...

  5. 【Socket编程】通过Socket实现TCP编程

    通过Socket实现TCP编程 Socket通信 : 1.TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器 ...

  6. 团队作业9——测试与发布(Beta版本)

    Beta版本测试报告 一bug汇总 计时没有显示即倒计时,难度不同的功能没有实现(已修复) 没有导入试卷和错题功能(不打算修复) 前台管理功能(部分修复) 界面美观问题(没有修复也不打算修复) 二.场 ...

  7. 201521123073 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码: ...

  8. 201521123005《java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. ·继承(是什么,意义) -父类(被继承的类) -子类(继承父类) -多态(解决重复代码的问题 ...

  9. 201521123002 《Java程序设计》第2周学习总结

    <Java程序设计>第2周学习总结 1. 本章学习总结 String 1.String类的对象是不可变(immutable)的 2.拼接(+号) "PG"+13; (一 ...

  10. 201521123017 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 Q1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.2 te ...