最近公司有AR开发的需求,需要使用手机扫描图片显示出不同的模型,同时模型要有旋转、缩放的功能,提供的框架是Vuforia。那么经过一个星期的研究,也算是完成了任务,现在总结出开发中遇到的一些坑,具体源码放在Gitee。
项目地址
https://gitee.com/GrapeM/vuforia_image_recognition
使用场景:根据多个模型图片,手机相机扫描后出现对应的模型,需要快速加载出模型,使用的模型都为OBJ模型。
使用技术:Java(不需要JNI)
主要知识点:
- 替换识别图片
- 序列化模型OBJ文件
首先说一下遇到的坑,Vuforia原始的加载模型方法就是一个坑,研究过一段时间的人大概都清楚。它的操作流程大概是这样的:
1. 将一个模型文件(OBJ)转化为.h文件
2. 将.h中的法线、顶点、纹理三个坐标点分别放在三个txt
3. 读取解析txt显示模型。
这一系列让人窒息的操作不仅仅是麻烦,而且解析txt的再显示模型的速度是慢的不得了。所以研究了两天,不得不从新寻找其他方法代替。
开始之前,先准备好一些工作。申请key,替换识别的图片。
地址:https://developer.vuforia.com/
注册账号后点击:Develop ― License Manager ― Get Development Key
注册key后在里面可以拿到License Key放在项目的SampleApplicationSession.java中
Vuforia.setInitParameters(mActivity, mVuforiaFlags,"你的License Key");
设置key后,点击 Develop ― Target Manager ― Add Database 类型是device
在该Database里面点击 Add Target添加目标图片,宽度(width)会影响识别出来的模型的稳定性(不正确的话模型会明显抖动)
添加后Download DataBase下载图片数据库,将里面的dat,xml文件放入项目的assets文件夹中。
添加的图片质量有星级划分,等级越高越容易识别出来,至于如何评分可以搜索官方文档,大致概括为“模型与背景的对比度,模型本身的纹理清晰度和复杂度”。
之所以要序列化模型文件的原因,是因为加载模型速度实在是太慢,测试10个大概10M的模型,需要加载5分钟。这样的速度给客户使用,估计焦虑症都可以憋出来。
在此之前首先要从开始说那个原始加载OBJ文件的坑说起,弃用这个方法后我去Github找到了一个项目,是关于Vuforia与JPCT(加载3D模型框架)结合的项目。
项目地址:https://github.com/l123456789jy/VuforiaJpct
这个大佬的项目中就有OBJ和MD2格式的加载方法,需要通过JPCT框架的加载OBJ(MD2)的方法就可以简单实现模型调用。如果对模型加载速度没有需求,下载该项目即可。
对的,加载速度没有要求直接使用JPCT的加载OBJ模型就可以了,对比之前分成三个文件加载简直不要太方便。但是如果加载多个模型,这个方法的解析速度和原始方法的速度其实是差不多的,这时候便不满足我项目的需求。
所以我在JPCT官方上找到解决该问题的方法:模型文件序列化。
序列化就是将OBJ等模型文件转化成可以让JPCT更容易读取的文件,但该序列化文件操作必须要在电脑端的Java IDE执行(如Eclipse),将模型的OBJ,MTL(纹理文件),统一转化成一个ser文件。经过序列化的文件加载速度大大提升。(从10个文件的5分钟的加载时间减少到10秒)
其方法很简单,代码也放入项目当中,将转化后的ser文件和模型的贴图(png/jpg)放入assets中即可。
注:转化ser代码在项目文件夹“ObjToSer”,测试的目标图片在“TestImage”