ImageTracking_TargetOnTheFly

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

用法

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

详解

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

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

private IEnumerator TakePhotoCreateTarget()
{
    ...
    yield return new WaitForEndOfFrame();
    ...

    Texture2D photo = new Texture2D(Screen.width / 2, Screen.height / 2, TextureFormat.RGB24, false);
    photo.ReadPixels(new Rect(Screen.width / 5, Screen.height / 5, Screen.width * 3 / 5, Screen.height * 3 / 6), 0, 0, false);
    photo.Apply();

    byte[] data = photo.EncodeToJPG(80);
    Destroy(photo);

    string photoName = "photo" + DateTime.Now.Ticks + ".jpg";
    string photoPath = Path.Combine(directory, photoName);
    File.WriteAllBytes(photoPath, data);
    CreateImageTarget(photoName, photoPath);
    ...
}

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

private void CreateImageTarget(string targetName, string targetPath)
{
    GameObject imageTarget = new GameObject(targetName);
    var controller = imageTarget.AddComponent<ImageTargetController>();
    controller.SourceType = ImageTargetController.DataSource.ImageFile;
    controller.ImageFileSource.PathType = PathType.Absolute;
    controller.ImageFileSource.Path = targetPath;
    controller.ImageFileSource.Name = targetName;
    controller.Tracker = Filter;
    ...
}

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