AR拾取纹理功能实现
最近大家比较关注ColARMix和涂乐等这些应用,作为开发人员吸引大家的就是运行时拾取识别目标纹理,在以线框为识别目标的图片上,用户可以图画颜色,识别之后把涂有色彩的图片作为纹理时时赋给增强对象,让用户图画的颜色体现在增强对象上,看到自己在平面上涂的颜色反应到三维增强对象上。很感谢想到这些创意的牛人们!
AR进入中国视线自己就开始关注,不知不觉几年过去了,可能是移动设备硬件的限制,之前两三年的时间一直没有得到很好的发展,随着移动设备硬件的强大支持,越来越多的AR应用走进人们的视野,特别是在少儿教育这一块,ColAR Mix、涂乐、小熊尼奥等都是非常成功的案例,在AR少儿教育方面比较有创新性的功能也应属AR运行时拾取纹理功能了,大家都非常关注,努力去实现,平常在大学做技术培训,这一块也炒的非常热。当知道ColAR
Mix有拾取纹理这个功能后,感觉非常新颖,创意点也非常好,用在少儿教育方面恰到好处,能让孩子在乐趣和兴趣中快乐的学习成长。
至于此,作为程序开发人员,也尝试着实现,比如想到采集到图片之后,用OpenCV去实现图形图像变换以得到希望的目标纹理,走了不少弯路,但功夫不负有新人,最终实现了AR运行时拾取纹理功能。
先看看自己实现的具体效果:
现在把自己实现大致过程给列一下,相互学习,共同进步!
步骤:
1. 准备工作,对于AR开发人员这个都是废话
a) 确定开发环境Window7+Unity+Vuforia,这个也没什么限制,根据自己情况而定
b) 构建工程,创建场景
2. 注册用于图画的线框标识图,作为识别对象,在三维制作软件(3dsMax、maya等)里面把线框图作为纹理赋给你的增强对象
3. 获取ImageTarget四个角点,利用Camera的函数WorldToViewportPoint从世界坐标转换到视口坐标,加以判断,目的就是做到ImageTarget全部在视口内
4. 保证识别对象全部显示在视口内之后,利用Vuforia API提供的函数GetCameraImage()提取运行时图片,具体做法
见:https://developer.vuforia.com/forum/faq/unity-how-can-i-reset-frame-format-scene-reload
5. 这里得到的图片就是手机屏幕看到的,里面应确保ImageTarget全部显示在视野内,获取图片的同时,确定ImageTarget四个角点在图片中的位置,把得到的
图片数据以像素的形式保存到颜色数组(Color32[])中
6. 写一个图像展开(就是图形图像学里面的一些变换)算法,就是根据ImageTarget四个角点在图片中的位置,获取颜色数据中的有效像素点,根据Imagetarget
纹理大小,新创建一个Texture2D,以利用算法得到ImageTarget时时纹理,用什么算法具体自己研究,不在这里公开
7. 把纹理替换掉增强对象上的纹理即可。
这些是自己实现拾取颜色的流程,可能有更好的实现形式,希望在实现方式上可以和大家交流探讨。自己可以根据这些步骤来实现,相关的论坛上也有很多有用的信息,大家都可以参考,少走些弯路。毕竟要去实现个功能,肯定需要花费大量时间,多点耐心。
无论学习交流还是商用都可以发消息,相互学习,互利共赢。