上一节我们已经使用ARCore实现了识别图像并实例化3D模型,运行得非常完美,因为我们选择的图像评分为90分,识别速度也非常快,当然,作为示例,我们只在图像数据库(AugmentedImageDatabase)中加了一张图像,并且也没有对多图像跟踪做处理,但我们依然是实现了我们想要的效果。本节我们来做另一个ARCore1.5中刚新加的功能,就是动态添加目标图像数据到图像数据库中。在实际使用中,我们不可能把所有需要识别的图像都预先存储在图像数据库(AugmentedImageDatabase)中,这样是非常不灵活的,在ARCore1.5中就解决了这个问题,可以在运行时动态的添加图像到图像库中,下面我们就来实现他。
一、环境准备
刚才说了,这是ARCore1.5中新添加的功能,所以我们还需要新下载ARCore1.5.app以及 Unity_ARCore1.5 SDK,并配置好相应环境,并将我们上节中需要的资料准备好,这里可以参考之前的文章,不再赘述。准备好的环境如下图如所示:
二、编写代码
我们直接使用上一节的AppController,稍作修改代码如下:
public Camera FirstPersonCamera;
public Texture2D mFox;
public AugmentedImageDatabase imgBase;
public GameObject mprefab;
private bool mIsQuitting = false;
private const float mModelRotation = 180.0f;
public GameObject mFitToScanOverlay;
private Dictionary<int, GameObject> mVisualizers = new Dictionary<int, GameObject>();
private List<AugmentedImage> mTempAugmentedImages = new List<AugmentedImage>();
private bool mTracking = false;
void Start () {
OnCheckDevice();
Debug.Log("imgBase Count:"+imgBase.Count);
imgBase.AddImage("fox", mFox);
}
......
与上一节代码不同之处在于,我们声明了一个Public AugmentedImageDatabase 及一个 public Texture2D mFox,这一个用来引用我们的图像数据库,第二个是我们想要动态添加到图像数据库中的图像(为了方便理解,这里使用了最简单的引用图像的方式)。然后我们在 Start()方法中将图像动态的添加到了图像数据库中。AppController的相应设置如下图所示:
三、注意点
1、AugmentedImageDatabase
图像数据库(AugmentedImageDatabase)是存储由Arcore检测和跟踪的图像列表的数据库,图像数据库支持多达1000幅图像但在任何给定时间,只能使用一个图像数据库。
AddImage方法的原型为AddImage(string name, Texture2D image, float width)
参数 | 解释 |
---|---|
string name | 需要添加的图像名称,可随便写。 |
Texture2D image | 需要添加的图像。 |
float width | 需要添加的图像物理宽度(以米为单位),如果宽度不知道,则为0。或者使用默认值,不用处理。 |
返回值 | 添加到图像数据库后该图像的索引,如果出现错误,则为-1。 |
2、图像格式
经过测试,ARCore动态添加图像支持的格式非常之少。前面章节中我们提到过,ARCore图像数据库可以支持jpg,png两种图像格式,但动态添加时,很多jpg,png的编码格式都不支持,如ETC_RGB4、Alpha8等等,需要非常仔细的挑选作为目标图像的图像文件,不然很可能出现添加不成功的问题。
3、ARCore1.5.1
ARCore1.5.1下载安装后会莫名的停止工作,导致应用非常不稳定,也需要予以关注。
四、识别效果
识别效果与上节一致。