Unity+Hololens开发之实现识别二维码

发表于2018-07-22
评论0 6k浏览
使用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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引