Unity+Hololens开发之实现识别二维码
发表于2018-07-22
使用Unity开发HoloLens的原理和Unity开发移动端游戏一样,下面就来看下是是如何实现识别二维码功能的。
第一步:实现扫描二维码的功能
关于Unity识别二维码的教程,网上有很多教程,我目前看到的都是使用了ZXing.Net
1、ZXing.Net下载导入
ZXing.Net的下载地址:http://zxingnet.codeplex.com/
解压后找到里面的unity文件夹,底下有3个文件,如下:
把这三个文件拖到unity里面
2、实现二维码识别
这个借助插件很容易实现,网上有很多参考,Unity应用商店里也有提供的QRCode源码,下面是参考的一个比较简洁的写法,在这里对其稍作改动并加上注释:
using UnityEngine; using System.Collections; using ZXing; using UnityEngine.UI; public class QRcode : MonoBehaviour { /// <summary> 包含RGBA </summary> public Color32[] data; /// <summary> 判断是否可以开始扫描 </summary> private bool isScan; /// <summary> canvas上的RawImage,显示相机捕捉到的图像 </summary> public RawImage cameraTexture; /// <summary> canvas上的Text,显示获取的二维码内部信息 </summary> public Text QRcodeText; /// <summary> 相机捕捉到的图像 </summary> private WebCamTexture webCameraTexture; /// <summary> ZXing中的方法,可读取二维码中的内容 </summary> private BarcodeReader barcodeReader; /// <summary> 计时,0.5s扫描一次 </summary> private float timer = 0; /// <summary> /// 初始化 /// </summary> /// <returns></returns> IEnumerator Start() { barcodeReader = new BarcodeReader(); yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//请求授权使用摄像头 if (Application.HasUserAuthorization(UserAuthorization.WebCam)) { WebCamDevice[] devices = WebCamTexture.devices;//获取摄像头设备 string devicename = devices[0].name; webCameraTexture = new WebCamTexture(devicename, 400, 300);//获取摄像头捕捉到的画面 cameraTexture.texture = webCameraTexture; webCameraTexture.Play(); isScan = true; } } /// <summary> /// 循环扫描,0.5秒扫描一次 /// </summary> void Update() { if (isScan) { timer += Time.deltaTime; if (timer > 0.5f) //0.5秒扫描一次 { StartCoroutine(ScanQRcode());//扫描 timer = 0; } } } IEnumerator ScanQRcode() { data = webCameraTexture.GetPixels32();//相机捕捉到的纹理 DecodeQR(webCameraTexture.width, webCameraTexture.height); yield return 0; } /// <summary> /// 识别二维码并显示其中包含的文字、URL等信息 /// </summary> /// <param name="width">相机捕捉到的纹理的宽度</param> /// <param name="height">相机捕捉到的纹理的高度</param> private void DecodeQR(int width, int height) { var br = barcodeReader.Decode(data, width, height); if (br != null) { QRcodeText.text = br.Text; } } }
把这段程序挂到 Main Camera 上,创建一个canvas,创建 RawImage 和 Text 并拖拽到脚本上,其中Text是用于显示二维码内部信息的,RawImage是用于显示摄像头捕捉到的画面的。
然后测试一下,二维码的功能到这里就实现了,经测试在PC和Android平台上都适用,接下来是导出HoloLens的部分。
第二步:导出到HoloLens平台
导出HoloLens的时候就不怎么友好了,报了很多错误,问题出在ZXing:
在hololens论坛上找到了关于这个问题的讨论:
https://forums.hololens.com/discussion/3263/zxing-unity-barcode-dll-issue
下面这个网址提供了一种解决方案,使得导出时不会报错:
https://forums.hololens.com/discussion/2966/qr-scan-in-uwp-with-usb2-0-webcam-and-kinect-2
它的解决方法是:
把导入的插件按照如下方式放置:其中 要复制两份,一份放在WSAPlayer文件夹下,另一份放在Plugins目录下
放在WSAPlayer目录下的zxing.unity设置如下:
放在Plugins目录下的zxing.unity设置如下:
再导出时不会报错。
但是,当在HoloLens中查看时,发现仍然无法识别二维码!!!
查找原因,原来HoloLens的相机根本就没有开启!
解决方法如下:
现在可以用HoloLens识别出二维码中的内容了!
可是我之前使用的是Main Camera,因此canvas中的内容无法跟着头盔移动,接下来导入HoloLensToolKit的包,换上HoloLens的相机,但是这个相机是倒着的,0.0没查为什么,简单粗暴地把我的canvas也到倒过来了。。。
现在在HoloLens上调试感觉好多了
最后把我简陋的界面 =_=(以前只有一个 RawImage 和一个 Text)美化一下,顺手借用了QRCode插件里面的图片,变成了下面这个样子:
当然,在Hololens里面看的时候,文字就是正着的了,而且黑色的背景也会被过滤掉。。。
虽然上面说的比较清楚了,但是如果还需要我的源码,可以去这里下载:http://download.csdn.net/detail/wwanrong/9921225
里面包含源码和导出后的部分(放在APP文件夹下),可以直接在Hololens上运行:
注意:如果想重新导出,请先删除里面的App和UWP文件夹!!否则会出现奇怪的错误,每次导出都会重新生成UWP。
来自:https://blog.csdn.net/wwanrong/article/details/76589267