Hololens2二维码识别

配置

目前大部分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运行无误后,在部署的过程中有地址冲突的问题;不过换了电脑重新生成后问题解决(有可能是那台电脑有点问题)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode-每日一题【剑指 Offer 39. 数组中出现次数超过一半的数字】

题目 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2 限制&#xff1a; 1 < 数组长度 < 50000 解题思路 前置知…

无人机电力巡检方案在电网安全与维护中的应用

目前&#xff0c;无人机技术已经在各行各业都有广泛的应用&#xff0c;其中之一就是在电力巡检中的应用。无人机电力巡检方案以其高效、安全、精准的特点&#xff0c;为电网安全与维护带来了重大突破和进步。 一、无人机电力巡检方案是高效巡检的利器 传统的电力巡检方式需要人…

【深度学习】Vision Transformer论文,ViT的一些见解《 一幅图像抵得上16x16个词:用于大规模图像识别的Transformer模型》

必看文章&#xff1a;https://blog.csdn.net/qq_37541097/article/details/118242600 论文名称&#xff1a; An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale 论文下载&#xff1a;https://arxiv.org/abs/2010.11929 官方代码&#xff1a;https:…

Libevent开源库的介绍与应用

libeventhttps://libevent.org/ 一、初识 1、libevent介绍 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff…

RocketMQ 事务消息

事务消息是 RocketMQ 的高级特性之一 。这篇文章&#xff0c;笔者会从应用场景、功能原理、实战例子三个模块慢慢为你揭开事务消息的神秘面纱。 1 应用场景 举一个电商场景的例子&#xff1a;用户购物车结算时&#xff0c;系统会创建支付订单。 用户支付成功后支付订单的状态…

微信小程序选项卡切换(滑动切换,点击切换)

效果如下&#xff1a;可点击切换&#xff0c;滑动切换 代码如下 这个可以在项目用 index.wxml <view classtopTabSwiper><view classtab {{currentData 0 ? "tabBorer" : ""}} data-current "0" bindtapcheckCurrent>选项一&…

警惕!中科院预警,Frontiers这本不被收录!2023年7月EI目录已更新!(附全年下载)

2023年7月EI期刊目录更新 爱思唯尔官网近日更新了EI期刊目录&#xff0c;此次更新是2023年7月1日&#xff0c;与上次更新&#xff08;2023年6月&#xff09;相比&#xff0c;有1本期刊名称在Serials&#xff08;连续出版&#xff09;列表中搜索不到&#xff0c;详情如下&#…

Java课题笔记~ 动态SQL详解

一、动态 sql 是什么&#xff1f; 1、动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中&#xff0c;开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。 例如&#xff0c;拼接时要确保添加了必要的空格&#xff0c;还要…

AgileBoot - 全栈项目启动

AgileBoot-Back-End: 基于Ruoyi做了大量重构优化的基础快速开发框架。采用Springboot Vue 3 Mybatis Plus 更面向对象的业务建模 面向生产的项目。&#xff08;非玩具项目&#xff09; 首先克隆代码&#xff0c;同是克隆前端和后端的代码。 前端代码启动&#xff1a; np…

阿里云容器服务 Serverless 版(ACK Serverless)全新升级

7 月 31 日&#xff0c;阿里云智能云原生应用平台负责人丁宇宣布&#xff0c;容器服务 Serverless 版 ACK Serverless 全新升级。 ACK Serverless&#xff1a;免运维、极致弹性的 K8s 全托管服务 阿里云在 2018 年发布了首个 Serverless 容器服务 ASK&#xff0c;其本质是将容…

音视频--DTMF信号发送及检测

参考资料 https://zh.wikipedia.org/wiki/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91 1. DTMF是什么 1.1 DTMF定义 双音多频信号&#xff08;英语&#xff1a;Dual-Tone Multi-Frequency&#xff0c;简称&#xff1a;DTMF&#xff09;&#xff0c;电话系统中电话机与交换机之间…

list删除重复元素几种思路

文章目录 list删除重复元素几种思路hashsetStream流删除所有重复元素 list删除重复元素几种思路 hashset List<String> list2 new ArrayList<>();list2.add("a");list2.add("b");list2.add("a");Set<String> set new HashS…

uni-app 微信小程序自定义导航栏

一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏&#xff08;就是手机电量显示栏&#xff09;和小程序的导航栏组成&#xff0c;android手机一般为48px&#xff0c;ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…

1.初识typescript

在很多地方的示例代码中使用的都是ts而不是js&#xff0c;为了使用那些示例&#xff0c;学习ts还是有必要的 JS有的TS都有&#xff0c;JS与TS的关系很像css与less ts在运行前需要先编译为js&#xff0c;浏览器不能直接运行ts 目录 1 编译TS的工具包 1.1 安装 1.2 基本…

【力扣】 12. 整数转罗马数字 模拟

力扣 12. 整数转罗马数字 解题思路 当某个位数的某个数不为4或9时&#xff0c;高位对应的字符总是在低位对应的字符前面。只有当该数为4或9时&#xff0c;低位对应的字符在高位前面。 根据这一特性&#xff0c;我们进行分类讨论。 1.当数为4时&#xff0c;则对应的罗马数为 10 …

有多卷?智慧金融可视化大屏可以这样子

科学技术不断发展&#xff0c;数字化转型不断加快&#xff0c;智慧金融正成为金融业的新引擎。数字孪生、大数据、物联网等新一代信息技术在推动智慧金融更加强调效率、优化精准营销。数据可视化大屏如何为金融单位提供低代码、定制化的服务&#xff0c;让金融单位的数据可视、…

SOME/IP学习笔记1

SOA概念 在SOA中,每个服务就好像我们每一个人在社会中扮演的角色,在对别人提供着服务的同时,同时也享受着别人提供出来的服务,人与人之间,既是彼此独立的,又是需要互相通讯的。服务提供者将功能具象为一组接口,这样使用者就能知道如何调用服务,完成某件事情,得到某个…

文心一言 VS 讯飞星火 VS chatgpt (70)-- 算法导论6.5 9题

九、请设计一个时间复杂度为 (n lgk)的算法&#xff0c;它能够将 k 个有序链表合并为一个有序链表&#xff0c;这里 n 是所有输入链表包含的总的元素个数。(提示:使用最小堆来完成 k 路归并。 文心一言&#xff1a; 要设计一个时间复杂度为 O(n log k) 的算法&#xff0c;将 …

RabbitMQ快速入门

文章目录 1、RabbitMQ的概述1.1、什么是消息队列&#xff1f;1.2、为什么要使用消息队列&#xff1f;1.3、RabbitMQ的特点&#xff1a; 2、RabbitMQ的安装2.1 下载与安装2.2 常用命令 3、RabbitMQ消息发送和接受3.1 消息发送和接受机制3.2 AMQP的消息路由3.3 Exchange(交换机)的…

该选择WPF 还是 Winform?

WPF和WinForms都是.NET平台下的桌面应用程序开发框架&#xff0c;它们各有特点&#xff0c;适用于不同的场景和需求。下面是对WPF和WinForms的一些比较和优劣势&#xff1a;WPF&#xff08;Windows Presentation Foundation&#xff09;&#xff1a;WPF具有强大的图形渲染能力&…