easyAR unity3d识别拍照图片
2017-07-08 13:04
423 查看
左边红色箭头指向了一个脚本TargetOnTheFly。
这个图片中,gameObject左边加载了两个脚本。
FilesManager:用来进行拍照的。
ImageTargetManager:用来动态创建GameObject,来追踪拍出来的照片的
其中TargetOnTheFly的关键代码:
private void Awake() { imageManager = FindObjectOfType<ImageTargetManager>(); imageCreater = FindObjectOfType<FilesManager>(); } void OnGUI() { if (StartShowMessage) { if (!isShowing) StartCoroutine(showMessage()); StartShowMessage = false; } GUI.Box(new Rect(Screen.width / 2 - 250, 30, 500, 60), "The box area will be used as ImageTarget. Take photo!", skin.GetStyle("Box")); GUI.Box(new Rect(Screen.width / 4, Screen.height / 4, Screen.width / 2, Screen.height / 2), "", skin.GetStyle("Box")); if (isShowing) GUI.Box(new Rect(Screen.width / 2 - 65, Screen.height / 2, 130, 60), "Photo Saved", skin.GetStyle("Box")); if (GUI.Button(new Rect(Screen.width / 2 - 80, Screen.height - 85, 160, 80), "Take Photo", skin.GetStyle("Button"))) imageCreater.StartTakePhoto(); if (GUI.Button(new Rect(Screen.width - 160, Screen.height - 85, 150, 80), "Clear Targets", skin.GetStyle("Button"))) { imageCreater.ClearTexture(); imageManager.ClearAllTarget(); } }
其中
imageManager = FindObjectOfType<ImageTargetManager>(); imageCreater = FindObjectOfType<FilesManager>();
发现并获取ImageTargetManager和FilesManager对象。
为什么可以直接FindObjectOfType呢?肯定其他的地方加载了这两个object,下面会说明。
if (GUI.Button(new Rect(Screen.width / 2 - 80, Screen.height - 85, 160, 80), "Take Photo", skin.GetStyle("Button"))) imageCreater.StartTakePhoto();
这句话是按下”Take Photo”按钮的时候,拍照。
if (GUI.Button(new Rect(Screen.width - 160, Screen.height - 85, 150, 80), "Clear Targets", skin.GetStyle("Button"))) { imageCreater.ClearTexture(); imageManager.ClearAllTarget(); }
当按下Clear Targets按钮的时候清楚对象追踪和拍的照片文件。
上面提到肯定有两个地加载了ImageTargetManager和FilesManager对象。
在那呢?如下图:
在右侧创建了Empty的GameObject,取名叫SampleManager。
然后添加了两个组件ImageTargetManager和FilesManager。
所以以后就可以直接find了。这种是静态创建的。
ImageTargetManager的关键代码:
void Update() { var imageTargetName_FileDic = pathManager.GetDirectoryName_FileDic(); foreach (var obj in imageTargetName_FileDic.Where(obj => !imageTargetDic.ContainsKey(obj.Key))) { GameObject imageTarget = new GameObject(obj.Key); var behaviour = imageTarget.AddComponent<DynamicImageTagetBehaviour>(); behaviour.Name = obj.Key; behaviour.Path = obj.Value.Replace(@"\", "/"); behaviour.Storage = StorageType.Absolute; behaviour.Bind(ARBuilder.Instance.ImageTrackerBehaviours[0]); imageTargetDic.Add(obj.Key, behaviour); } }
上面是动态的安卓照片的key创建了gameObject,然后添加了DynamicImageTagetBehaviour类型的组件,最后绑定了ARBuilder.Instance.ImageTrackerBehaviours[0](tracker),当检测到图片的时候就能够识别拍照的图片了。
等等识别图片后,显示什么样的模型在哪配置的?
答案:就是DynamicImageTagetBehaviour。
DynamicImageTagetBehaviour的关键代码如下:
public class DynamicImageTagetBehaviour : ImageTargetBehaviour { private GameObject subGameObject; protected override void Awake() { base.Awake(); subGameObject = Instantiate(Resources.Load("EasyAR", typeof(GameObject))) as GameObject; subGameObject.transform.parent = transform; } }
加载了Resources目录下的EasyAR prefabs,转成了GameObject类型,
然后
subGameObject.transform.parent = transform;
让这个gameObject跟着识别出来的图像走。
相关文章推荐
- android 端拍照并运用Tesseract OCR 识别图片中字符
- 使用阿里云 身份证号正反面拍照图片识别信息
- android 相机使用(拍照、录像、图片查看、静态人脸识别、延时拍照)
- 使用Zxing实现拍照,选取图片识别二维码
- 小程序从本地相册选择图片或使用相机拍照wx.chooseImage上传后预览并可以识别图中二维码
- Android中通过Intent 调用图片、视频、音频、录音、拍照
- Android-->拍照/相册选择照片(从Uri中获取图片路径)
- 微信识别图片功能实现(以读取银行卡为例)
- Android 调用系统相机,拍照,并上传图片所注意的一些问题
- 转:【微信小程序】 微信小程序-拍照或选择图片并上传文件
- C# 图片识别(支持21种语言)
- 微信公众号页面调用拍照上传图片,包括预览没文件压缩,还有扫码功能
- Android中从SD卡中/拍照选择图片并进行剪裁的方法
- Android中从SD卡中/拍照选择图片并进行剪裁的方法
- HTML5拍照上传图片&Phonegap封装HTML5调用Android相机拍照上传到PHP端
- 关于android中调用系统拍照,返回图片是旋转90度的处理
- C#实现将网页保存成图片的网页拍照功能
- 调用android系统相机拍照并将图片传指定路径并获取相片
- 拍照+相册选取+剪裁图片,不过百行代码搞定
- Android 拍照或从相册取图片并裁剪