Hololens2二维码识别

news2024/12/26 11:32:59

配置

目前大部分Hololens进行二维码识别的开发都是基于ZXing的包完成,首先需要完成zxing.unity.dll,很多地方应该都能下载,也可以直接上github上下载(下载点这里)。

下载时注意一下版本就好,过老的zxing兼容性可能存疑,我这边使用的是 0.16.8.0的版本。

直接在项目Assets下新建Plugins,将dll拖入文件。
在这里插入图片描述

配置的话,用默认的就可以(这里面最重要的是UMP的平台配置,不过不用管,默认就支持了)。
在这里插入图片描述

场景需求

场景中需要有一个UI Canvas,文档下面应该包含RawImage和Text两个组件,同时需要一个相机获取权限Main camera。

在这里插入图片描述

代码

代码的话我试了两段代码,应该都没问题。

方法一:


using UnityEngine;
using System.Collections;
using ZXing;
using UnityEngine.UI;


public class qrB : 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>
    void Start()
    {
        barcodeReader = new BarcodeReader();
        //yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//请求授权使用摄像头
        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;
        }

    }

}

方法二:

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.Serialization;
using ZXing;

public class qrC : MonoBehaviour
{
    //相机捕捉到的图像
    private WebCamTexture webCameraTexture;
    //ZXing中的类,可读取二维码的内容
    private BarcodeReader barcodeReader;
    //计时,0.5s扫描一次
    private float scanInterval = 0.5f;
    //存放摄像头画面数据
    private Color32[] data;
    //显示摄像头画面
    public RawImage cameraTexture;
    //显示二维码信息
    public Text QRCodeText;
    //是否正在扫描
    private bool scaning;

    //定义未找到设备相机事件
    [Serializable]
    public class NoCameraErrorEvent : UnityEvent { }
    [FormerlySerializedAs("NoCameraError")]
    [SerializeField]
    private NoCameraErrorEvent m_NoCameraError = new NoCameraErrorEvent();
    //定义扫码成功事件
    public Action<string> OnCompleted;

    //开始扫描二维码
    public void StartScanQRCode()
    {
        StartCoroutine(RequestWebCamAuthorization());
    }


    //请求相机权限
    IEnumerator RequestWebCamAuthorization()
    {
        barcodeReader = new BarcodeReader();
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//请求授权使用摄像头
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;//获取摄像头设备
            if (devices.Length == 0)
            {
                Debug.LogError("device no camera available");
                m_NoCameraError.Invoke();
                yield break;
            }
            string devicename = devices[0].name;
            webCameraTexture = new WebCamTexture(devicename, 400, 300);//获取摄像头捕捉到的画面

            if (cameraTexture != null)
            {
                cameraTexture.enabled = true;
                cameraTexture.texture = webCameraTexture;
            }

            webCameraTexture.Play();

            StartCoroutine(ScanQRCode());
        }
    }

    //扫描二维码
    private IEnumerator ScanQRCode()
    {
        scaning = true;
        while (true)
        {
            data = webCameraTexture.GetPixels32();//相机捕捉到的纹理
            DecodeQR(webCameraTexture.width, webCameraTexture.height);
            yield return new WaitForSeconds(scanInterval);

            if (!scaning)
                break;
        }
    }

    /// <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)
        {
            //Debug.LogFormat("QR Code: {0}", br.Text);
            if (QRCodeText != null)
            {
                QRCodeText.text = br.Text;
                Debug.Log(br.Text);     //接口位置!
            }
                
                
            Stop();
            OnCompleted?.Invoke(br.Text);
        }
        else
        {
            if (QRCodeText != null)
                QRCodeText.text = "";
        }
    }

    //停止扫描
    public void Stop()
    {
        scaning = false;
    }

    private void Start()
    {
        StartScanQRCode();
    }
    private void Update()
    {
        ScanQRCode();
    }
}

经过测试,都可用。

效果

在这里插入图片描述

常见问题

问题一:注意启动Hololens的相机,project setting–> player --> Publishing Setting -->WebCam勾选。
在这里插入图片描述
问题二:我这边在unity运行无误后,在部署的过程中有地址冲突的问题;不过换了电脑重新生成后问题解决(有可能是那台电脑有点问题)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell脚本中set -e的作用

set -e作用描述&#xff1a;shell中脚本运行中可能出现命令执行失败的情况&#xff0c;如果执行失败对后续有影响那么就应该退出脚本&#xff0c;不继续往下执行。set -e 命令就可以避免操作失败还继续往下执行的问题。 #!/bin/shset -eecho "make axp ..."VERSION$…

JVM-运行时数据区

目录 什么是运行时数据区&#xff1f; 方法区 堆 程序计数器 虚拟机栈 局部变量表 操作数栈 动态连接 运行时常量池 方法返回地址 附加信息 本地方法栈 总结&#xff1a; 什么是运行时数据区&#xff1f; Java虚拟机在执行Java程序时&#xff0c;将它管…

BI报表工具有哪些作用?奥威BI全面剖析数据

BI报表工具有哪些作用&#xff1f;主要的作用是通过整合多业务来源数据&#xff0c;全面分析挖掘数据&#xff0c;来帮助企业实现数据化运营、支持智能决策、实现数据资产沉淀和增值、进行数据挖掘和预测分析、提高数据可读性和数据可视化程度等&#xff0c;从而提高企业的竞争…

目标用户特征分析常见4大方法

用户特征分析直接影响需求分析、用户体验设计等软件开发的关键环节&#xff0c;如果不对用户特征进行科学分析&#xff0c;不能获得用户真实意图&#xff0c;这直接影响需求分析质量&#xff0c;对整个项目影响较大。 因此我们需要用科学的方法对目标用户进行特征分析。而常见的…

腾讯云-宝塔添加MySQL数据库

1. 数据库菜单 2. 添加数据库 3. 数据库添加成功 4. 上传数据库文件 5. 导入数据库文件 6. 开启数据库权限 7. 添加安全组 (宝塔/腾讯云) 8. Navicat 连接成功

深入了解PostgreSQL:高级查询和性能优化技巧

在当今数据驱动的世界中&#xff0c;数据库的性能和查询优化变得尤为重要。 POSTGRESQL作为一种开源的关系型数据库管理系统&#xff0c;在处理大规模数据和复杂查询时表现出色。 但随着数据量和查询复杂性的增加&#xff0c;性能问题可能会显现出来。 本文将深入探讨POSTGR…

机器学习深入浅出

机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来让计算机自主学习数据并做出预测和决策。这种技术正在被广泛应用于各种领域&#xff0c;包括自然语言处理、计算机视觉、语音识别、医学诊断和金融预测等。在本篇博客中&#xff0c;我们将介绍机器学习的基本概…

python的decimal或者叫Decimal,BigDecimal

前言 在python中进行小数计算时&#xff0c;很容易发生精度错误问题&#xff01;&#xff01;&#xff01;&#xff01;一定要注意&#xff01;&#xff01;&#xff01;或者说&#xff0c;只要进行小数的运算都要用decimal。如&#xff1a;银企对账&#xff1b;工程计算等等在…

(十一)大数据实战——hadoop高可用之HDFS手动模式高可用

前言 本节内容我们介绍一下hadoop在手动模式下如何实现HDFS的高可用&#xff0c;HDFS的高可用功能是通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障&#xff0c;如机器崩溃或机器需要升级维护&#xff0c;这时可通过此种…

Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展

我们非常兴奋地宣布&#xff0c;Amazon Aurora Serverless v2 现已面向 Aurora PostgreSQL 和 MySQL 正式发布。Aurora Serverless 是一种面向 Amazon Aurora 的按需自动扩展配置&#xff0c;可让您的数据库根据应用程序的需求扩展或缩减容量。 亚马逊云科技开发者社区为开发者…

4 Promethues监控主机和容器

目录 目录 1. 监控节点 1.1 安装Node exporter 解压包 拷贝至目标目录 查看版本 1.2 配置Node exporter 1.3 配置textfile收集器 1.4 启动systemd收集器 1.5 基于Docker节点启动node_exporter 1.6 抓取Node Exporter 1.7 过滤收集器 2. 监控Docker容器 2.1 运行cAdviso…

ansible控制主机和受控主机之间免密及提权案例

目录 案例描述 环境准备 案例一--免密远程控制主机 效果展示&#xff1a; 解决方案 1.添加主机 2.通过ssh-key生成密钥对 3.生成ssh-copy-id 4.验证 案例二-----免密普通用户提权 效果展示 解决方案 1.使用普通用户&#xff0c;与案例一 一样&#xff0c;进行发送密钥…

不懂路由协议分类?这五个常用路由协议一定要掌握

摘要&#xff1a; 路由协议在计算机网络中起着非常重要的作用&#xff0c;用于选择数据包传输路径&#xff0c;能够帮助网络管理员有效地管理网络流量。路由协议有很多种&#xff0c;例如RIP、EIGRP、IS-IS等&#xff0c;那么路由协议如何分类&#xff1f;分享给大家一些常用的…

kubernetes之Ingress

一、背景 Ingress是k8s中实现7层负载的实现方式&#xff0c;是公开集群外部流量到集群内服务的HTTP和HTTPS路由 二、Ingress基础 通常Ingress实现由Ingress 控制器和Ingress组成&#xff0c;Ingress控制器负责具体实现反向代理及负载均衡&#xff0c;Ingress负责定义匹配规则和…

Pytorch(四)

目录 一、RNN(递归神经网络) 二、GAN(对抗生成网络) 三、OCR 四、注意力机制 一、RNN(递归神经网络) 主要应用于NLP(自然语言处理) 二、GAN(对抗生成网络) 原理:存在一个生成器与判别器&#xff0c;随着双方矛盾升级&#xff0c;从而双方性能不断增强。 GAN网络组成:生成网…

uniapp使用阿里图标

效果图&#xff1a; 前言 随着uniApp的深入人心&#xff0c;我司也陆续做了几个使用uniapp做的移动端跨平台软件&#xff0c;在学习使用的过程中深切的感受到了其功能强大和便捷&#xff0c;今日就如何在uniapp项目中使用阿里字体图标的问题为大家献上我的一点心得&#xff0…

【Linux】—— 进程的创建和退出

序言&#xff1a; 在上期&#xff0c;我们已经对 Linux的进程的相关知识进行了相关的学习。接下来&#xff0c;我们要学习的便是关于进程控制 的基本知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;进程创建 1、fork函数初识 2、写时拷贝 3、f…

Vue2 第十三节 使用Vue脚手架 (二)

1. ref属性 2. props配置项 3.mixin混入 4.plugin插件 一. ref属性 ① 作用&#xff1a;用于给节点打标识&#xff08;给元素或者组件注册引用信息&#xff0c;id的替代者&#xff09; ② 语法&#xff1a; 应用在html标签上获取的是真实的DOM元素&#xff0c;应用在组件…

SpringCloudAlibaba之Nacos配置中心

第一步&#xff1a;引入jar包 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> 第二步&#xff1a;在resources下创建一个bootstrap.yml文档…

微信可以防止被拉黑,原来这样设置→

微信真是隔三差五上个热搜&#xff0c;这不得被别的 App 羡慕死 这不&#xff0c;前几天#原来微信可以防拉黑#的话题冲上了热搜。 说到拉黑&#xff0c;大伙大部分应该都体验过&#xff0c;在生活中我们和好朋友之间难免有摩擦&#xff0c;往往有些朋友情绪一上来就把你拉黑了。…