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
