添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Unity 中的 QR 码跟踪

使用 HoloLens 2 和沉浸式头戴显示设备,可以检测头戴显示设备周围环境中的 QR 码,从而在每个代码的真实位置建立坐标系统。 还可以在多个设备上在同一位置呈现全息影像,以打造共享体验。 启用设备的网络摄像头后,你将能够识别最新版本的项目中的 QR 码。 为获得进入生产阶段的最佳结果,建议你查看 最佳做法 部分。

本文介绍以下内容:

  • QR 代码跟踪支持的设备
  • 支持的 QR 码版本
  • QR 码检测最佳做法
  • QR 码四周的安静区域
  • 照明和背景
  • QR 码的大小
  • 与 QR 码的距离和角度位置
  • 管理 QR 码数据
  • QR 码在空间中的放置
  • 故障排除和常见问题解答
  • 需要哪些功能?
  • 如何实现使 QR 码跟踪功能在HoloLens 2设备上正常工作?
  • 在哪里能找到 API 插件文件?
  • 如何准备 UWP 以使用 Microsoft.MixedReality.QR.QRCodeWatcher?
  • 如何通过 MixedReality QRCodeWatcher 准备 Unity?
  • 如何制作 QR 码?
  • 如果 QR 码跟踪通常不起作用,我该怎么办?
  • 准确性如何?
  • 我需要离 QR 码多近才能检测到它?
  • 为什么我无法读取带有徽标的 QR 码?
  • 检测到 QR 码,为什么我没有收到任何数据?
  • QR 码是保存在“空间”级别还是应用级别?
  • 在基础平台中如何实现此操作? QR 码保存在何处?
  • 收到“ Microsoft.MixedReality.QR.pdb ”错误消息时,如何在 Visual Studio 中调试应用?
  • HoloLens 第 1 代 HoloLens 2 沉浸式头戴显示设备

    Windows 10 版本 2004 及更高版本支持在台式计算机上通过沉浸式 Windows Mixed Reality 头戴显示设备进行 QR 码跟踪。 使用 Microsoft.MixedReality.QRCodeWatcher.IsSupported() API 确定当前设备是否支持该功能。

    支持的 QR 码版本

    下表列出了支持的和不支持的 QR 码版本:

    QR 码四周的安静区域

    若要正确读取,QR 码要求码的四周有边距。 此边距不能包含任何打印内容,并且应为四个模块(码中的单个黑色方块)宽度。

    QR 规范 包含有关安静区域的详细信息。

    照明和背景

    QR 码检测质量容易受到不同的照明和背景的影响。

  • 在正常照明条件下,为黑色/白色模块提供足够的对比度,以获得更好的性能。

  • 在光线较亮或背景较暗的极端光照条件下,可以尝试降低和调整对比度,以提高 QR 码检测率。 QR 码内的白色背景可以从 255 减少。

    QR 码大小

    Windows Mixed Reality 设备不能使用边长小于 5 厘米的 QR 码。

    对于边长范围介于 5 cm 到 10 cm 之间的 QR 码,设备必须非常靠近才能检测到此码。 检测此码可能需要更长时间。

    检测代码的确切时间不仅取决于 QR 码的大小,还取决于你与代码的距离。 靠近 QR 码将有助于抵消 QR 码大小问题。

    与 QR 码的距离和角度位置

    跟踪相机只能检测到特定级别的详细信息。 对于沿两侧 (小于 10 厘米的小代码,) 必须相当接近。 对于大小从 10 厘米到 25 厘米不等的版本 1 QR 码,最小检测距离介于 0.15 米和 0.5 米之间。

    大小的检测距离呈线性增加,但也取决于 受支持 QR 版本 或模块大小。 版本越高,模块就越小,只能从更靠近的位置检测到。 如果希望延长检测距离,也可以尝试使用微型 QR 码。 QR 检测适用于 +- 45 度的角度范围,以确保有适当的分辨率来检测该码。

    其他检测注意事项:

  • 不支持曲面上的 QR 码。
  • 支持平面方向。 平面外应不得超过 +-45 直视以获得更好的检测。
  • QR 码的物理大小应具有至少 2/3 像素的模块。 注意:更高版本的 QR 码具有更小的模块。
  • 有关实现最佳检测的 QR 码距离和大小之间的权衡关系,请参阅下图:

    请始终确保有足够的对比度和正确的边框。

    管理 QR 码数据

    Windows Mixed Reality 设备在驱动程序的系统级别上检测 QR 码。 当重新启动设备或重新启动驱动程序时,将清除检测到的 QR 码历史记录。 重新检测的 QR 码将视为新对象。

    建议将应用配置为忽略特定时间戳之前的 QR 码,时间戳可在应用中指定。 QR 码 API 指定上次检测发生的时间。 大多数应用开发人员会使用应用启动时的系统时间来确定检测到 QR 码的时间。

    QR 码数据并非特定于应用。 在应用启动后,会提供一个可用 QR 码列表。 应用开发人员将确定哪些 QR 码与此应用相关。

    QR 码在空间中的放置

    有关在何处以及如何放置 QR 码的建议,请参阅 HoloLens 的环境注意事项

    故障排除和常见问题解答

    需要哪些功能?

    需要将网络摄像头功能添加到清单中( Unity 功能 中的复选框)。 如果要构建为标准 UWP 项目,它也位于解决方案项目的 package.appxmanifest 中。

    通过调用以下函数来请求访问:

    #if WINDOWS_UWP
    async QRCodeWatcher.RequestAccessAsync();
    #endif
    

    访问状态应为 (status == QRCodeWatcherAccessStatus::Allowed)

    如果访问被拒绝,启动 QRTracking 时,该功能将返回访问被拒绝。

    应在构造 QRCodeWatcher 对象之前调用此 API。

    如果是从 Unity 运行项目,还需要确保从 UI 线程调用。 否则,API 将始终返回访问被拒绝。 有关详细信息,请参阅 Unity 手册中的 AppCallbacks 类

    有关设置 Unity 项目的详细信息,请参阅为 Windows Mixed Reality 配置 Unity

    如何实现使 QR 码跟踪功能在HoloLens 2设备上正常工作?

    QR 跟踪在 HoloLens 2 上自动启用,你需要在应用中添加网络摄像头功能。

    在哪里能找到 API 插件文件?

    可在此处找到所有必需的文件和文档。

    https://www.nuget.org/packages/Microsoft.MixedReality.QR

    如何准备 UWP 以使用 Microsoft.MixedReality.QR.QRCodeWatcher?

  • 使用 NuGet pack 将所需文件解压缩。

  • 在项目中添加对 Microsoft.MixedReality.QR.winmd 的引用,并开始使用 API。

  • 添加正确的插件体系结构版本,并在内部版本中相应地使用这些版本。

    如何通过 MixedReality QRCodeWatcher 准备 Unity?

    将 NuGet for Unity,并指向上述 NuGet pack。

    如何制作 QR 码?

    查看任何 QR 码生成器 -- 下面是一个示例

    如果 QR 码跟踪通常不起作用,我该怎么办?

  • QR 码版本是否是受支持的版本? 我们不支持高密度版本,如版本 40。 高于版本 10 的版本不能保证受支持;高于 20 的版本不受支持。
  • 离 QR 码是否足够近? 请参阅与 QR 码的距离和角度位置
  • 照明情况如何? 存在一个已知问题,即当 QR 码位于深色环境背景上时,检测变得困难--由于高对比度,QR 码在相机上显示为被冲走。 有关详细信息,请参阅照明和背景
  • 准确性如何?

    在单帧中检测时,预计大小与实际大小最多有 1% 的误差。 例如,10 厘米的代码在测量大小上可能高达 +/- 1 毫米。 在连续检测下,码的位置可能会漂移最多 +/- 2.5 毫米。 一旦移出检测范围,之前的检测位置将取决于映射误差。

    我需要离 QR 码多近才能检测到它?

    显然,距离取决于 QR 码的大小,以及它的版本。 有关详细信息,请参阅与 QR 码的距离和角度位置

  • HoloLens 2,对于版本 1 QR 码的两侧从 5 厘米到 25 厘米不等,最小检测距离范围为 0.25 米到 0.5 米。 可以检测到的距离从最小代码的大约 0.5 米到 2 米(对于较大代码)。
  • 在 Windows Mixed Reality 中,这些大小的距离将减半。
  • 对于任何较大的代码,外推- 大小检测距离呈线性增加。 对于任何较小的代码,检测根本不会发生--4-5 厘米是我们可以检测到的最小代码。
  • 为什么我无法读取带有徽标的 QR 码?

    目前不支持带有徽标的 QR 码。

    检测到 QR 码,为什么我没有收到任何数据?

  • 如果平台无法解码 QR 码,将不会向你提供数据。 你可以使用流,并使用开源代码解释数据。
  • 某些功能(如结构追加)不受支持。
  • 有关详细信息,请参阅支持哪些 QR 码版本?

    QR 码是保存在“空间”级别还是应用级别?

    在驱动程序会话或 HoloLens 上的启动会话中,QR 码在系统级别保存。 有关详细信息,请参阅管理 QR 码数据

    在基础平台中如何实现此操作? QR 码保存在何处?

    检测到的 QR 码由驱动程序保存在内存中。

    收到“Microsoft.MixedReality.QR.pdb”错误消息时,如何在 Visual Studio 中调试应用?

    已跳过 Microsoft.MixedReality.QR.dll 的符号加载,因为未在包含的模块列表中指定它。

    按照以下步骤重现此行为:

  • 安装 Microsoft.MixedReality.QR (NuGet) 和 MRTK
  • 应能用 Microsoft.MixedReality.QR.dll 调试应用,但找不到此 DLL:

    我们正努力将符号添加到下一个版本。 同时,应该仍可以通过在 Visual Studio 选项中排除 DLL 来调试应用:

    有关详细信息,请参阅配置 Visual Studio 的设置

    会话中可扫描的 QR 码数量是否有限制?

    在驱动程序的系统级别,在 10 分钟内保存的 QR 码限制为 100 个。

    QR 码平滑处理过程是否有更改?

    QR 码平滑处理过程在 20H2 后发生了变化,从姿势平滑到大小平滑。 若要还原上一个平滑过程的行为,如果检测到新的 QR 码姿势数据在距先前检测到的帧的 5 秒或 10 厘米内,将应用平滑算法。 转换数据通过当前帧的 90% 和上一帧的 10% 的加权比率进行混合。

  • 使用本机 C++ 和 C# 示例跟踪 QR 码
  • Unity 中的 QR 码跟踪
  • Azure 空间定位点
  • HoloLens 2 可定位相机概述
  •