ImageTracking_TargetOnTheFly

演示如何直接从相机图像中实时创建target并load到tracker中

用法

../../_images/image_25.png
标记1:捕捉图像区域。
标记2:捕捉Mark 1内图像并使用该图像创建识别图。
标记3:卸载并删除所有已经创建的ImageTarget及缓存。

详解

使用相机图像的一部分作为target

这个 sample将相机图像的一部分当作target来使用。首先获取对应的图像数据并编码图像。

private IEnumerator CaptureAndCreateTarget()
{
    yield return new WaitForEndOfFrame();

    var size = new Vector2Int((int)(Screen.width * 0.6f), (int)(Screen.height * 0.5f));
    var texture = new Texture2D(size.x, size.y, TextureFormat.RGB24, false);
    texture.ReadPixels(new Rect(Screen.width * 0.2f, Screen.height * 0.2f, size.x, size.y), 0, 0, false);
    texture.Apply();

    var target = CreateImageTarget(Instantiate(texture));

    targets.Add(target);
    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
    quad.GetComponent<MeshRenderer>().material.mainTexture = texture;
    quad.transform.SetParent(target.transform, false);
    quad.transform.localScale = new Vector3(1, (float)size.y / size.x, 1);
    var panda = Instantiate(Panda);
    panda.transform.SetParent(target.transform, false);
}

可以通过图像来创建target。创建一个空的 GameObject 并添加 ImageTargetController ,然后使用图像文件设置 ImageTargetController

private ImageTargetController CreateImageTarget(Texture2D texture)
{
    var targetObject = ARSessionFactory.CreateController<ImageTargetController>();
    var controller = targetObject.GetComponent<ImageTargetController>();
    controller.TargetDataLoad += (_) => Destroy(texture);
    controller.Source = new ImageTargetController.Texture2DSourceData
    {
        Texture = texture
    };
    controller.Tracker = Filter;
    return controller;
}

这个 sample使用了非常直接的方法来创建target,但这不是性能最佳的方式。为达到最佳性能,可以使用image数据的字节数组创建 Image ,并使用 ImageTarget.createFromParameters 来创建target。