分享磨砺营马剑威老师讲解-Android中AR应用开发技巧

  【威哥说】AR技术在这两年非常火爆,从去年开始,手机上各种AR的应用也渐渐兴起,究其原因是AR能够呈现给我们绚丽的效果,比起二维码的单调,扫描图片就可以动起来。今天,我就带大家制作Android版AR应用。
  【正文】增强现实(Augmented Reality,简称AR),增强现实技术,它是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,是把原本在现实世界的一定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),通过电脑等科学技术,模拟仿真后再叠加,将虚拟的信息应用到真实世界,被人类感官所感知,从而达到超越现实的感官体验。真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。

AR应用开发 要编写AR应用,必须用c语言,也就要用到NDK,本次实现过程要使用一个非常强大的AR SDK-EasyAR,EasyAR是Easy AugmentedReality的缩写,是视辰信息科技的增强现实解决方案系列的子品牌。它具有强大的跨平台能力,支持Windows/Mac OS/Android/iOS等主流的操作系统,EasyAR支持使用平面目标的AR,支持1000个以上本地目标的流畅加载和识别,支持基于硬解码的视频(包括透明视频和流媒体)的播放,支持二维码识别,支持多目标同时跟踪。作为一个SDK,它的API设计也比较简洁,因此,选择EasyAR进行项目的编写。 这是官方网站 http://www.easyar.cn/ ,需要申请key,目前是免费。 下面是环境的搭建: 要进行AR开发,必须使用NDK,由于EasyAR SDK目前不支持纯Java的API,所以我们需要同时编写Java和C++代码来使用EasyAR。为了能够在Android程序中同时运行C++和Java的代码,Google提供了Android NDK(Native Development Kit),它可以允许用户使用C/C++之类的原声代码在Dalvik虚拟机中执行部分程序。 本项目也需要配置AndroidNDK,当前使用的IDE是Android Studio 1.5,NDK版本为Android NDK r10e,这里大家要注意,不要使用低于1.5的Android Studio,不然会有问题,JDK要求1.7. 首先,要想使用NDK,必须先根据Android官方文档修改build.gradle。根据此网站进行配置:http://tools.android.com/tech-docs/android-ndk-preview 修改后再对build..gradle进行EasyAR配置,根据此网站配置 http://www.easyar.cn/view/docs/Getting-Started/Setting-up-EasyAR-Android-SDK.html 环境配置好以后,记得在这里Clean并且Rebuild项目,以免发生错误。 主要步骤是: 1、 新建名为GuideActivity的Class和guide.xml的布局文件,绘制启动界面和过渡动画,并且在最后调用MainActivity,释放自己。 2、 在AndroidManifest.xml中增加GuideActivity的属性信息,并将其设置为默认启动的Activity。具体增加的配置信息如下: android:name=".GuideActivity" android:configChanges="orientation…"> 在操作界面上有3个按钮,从左到右分别是“重播”、“打开网页”和“扫描二维码”。点击它们可以完成相应的功能。 在MainActivity的开始处,需要先调用EasyAR的初始函数,并且创建GLView用于OpenGL绘图。 EasyAR.initialize(this, key); // 使用key初始化EasyAR引擎 nativeInit(); // 设置匹配图片namecard和目标配置文件target.json GLView glView = new GLView(this); // 继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。 glView.setRenderer(new Render()); // glView 置于视图的顶部(覆盖显示) glView.setZOrderMediaOverlay(true); 接下来设置3个按钮的监听函数,它们的OnClickListener都会调用相应的其他函数完成按钮对应的功能,而OnTouchListener则用于显示按钮不同状态下的图片,以达到点击按钮时的动画效果。 为了建立完整的AR场景,一个CameraDevice需要attached到ImageTracker,然后Augmenter需要周期性地从ImageTracker获取新的Frame。attach和newFrame操作让整个AR链条开始工作,而数据则在这个链条上流动。 从CameraDevice产生的Image会在每帧进入ImageTracker并推动tracker运行。这些Image将跟随Frame进入Augmenter。 Target从图像和json文件中构造出来,可以被加载进ImageTracker。当它被tracker检测或跟踪到,将会跟随Frame进入Augmenter。最终移动到AugmentedTarget。 下面介绍AR功能的实现: 在jni文件夹中有5个.cc/.hpp文件。他们是实现AR效果的核心代码。其中ar.hpp和ar.cc中定义了Class AR,实现了包括相机初始化、载入json、图片文件、视频的播放、停止、内存释放、OpenGL的刷新和Resize。 class AR { public: AR(); virtual ~AR(); virtual bool initCamera(); virtual void loadFromImage(const std::string& path); virtual void loadAllFromJsonFile(const std::string& path); virtual bool start(); virtual bool stop(); virtual bool clear(); virtual void initGL(); virtual void resizeGL(int width, int height); virtual void render(); void setPortrait(bool portrait); }; 在helloarvideo.cc中实现了继承自Class AR的Class HelloARVideo,它在Class AR的基础上实现了从摄像头获取图像,并从中得到对应的ImageTargetID、二维码文本。Helloarvideo.cc中实现的若干JNI函数也是C++与Java代码的接口。 Renderer.hpp/.cc实现了通过相机的位姿和图片的位置,将视频流进行投影变换至合适的尺寸。它主要是为了helloarvideo.cc中的功能服务的。 Java文件中还有Render和GLView两个Class。其中Render负责调用MainActivity中在helloarvideo.cc里实现的函数。GLView负责增强后视频的绘制。 本文出自微信公众号mjw-java,更多精彩内容关注微信公众号或访问网站www.moliying.com

转载于:https://my.oschina.net/moliying/blog/727644

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值