AR.js 很难进行垂直放置的图像跟踪 - AR 甚至有意义吗?

问题描述

我们在大墙上有一幅大壁画。要求在您的手持设备(如智能手机的相机)上查看这幅壁画时,图像叠加应放置在该壁画内的特定位置(该壁画已遗漏部分,应在顶部显示相应的剪裁)。>

现在,我遵循了 ar.js 图像跟踪教程,它确实有效,但我觉得这几乎完全是为水平和小位置设计的。就像将汽车放在办公桌上一样。我设法放置在壁画顶部的物体无法定位,即使您添加了方向转换器或旋转了物体。

这是我到目前为止所拥有的,经过不同尺寸、旋转、位置的测试:

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/gh/aframevr/aframe@1c2407b26c61958baa93967b5412487cd94b290b/dist/aframe-master.min.js"></script>
  <script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar-nft.js"></script>
  <title></title>
</head>
<body style="margin : 0px; overflow: hidden;">
  <a-scene
    vr-mode-ui="enabled: false;"
    renderer="logarithmicDepthBuffer: true;"
    embedded
    arjs="trackingMethod: best; sourceType: webcam;debugUIEnabled: false;"
  >
    <a-nft
      type="nft"
      url="url"
      smooth="true"
      smoothCount="10"
      smoothTolerance=".01"
      smoothThreshold="5"
      size="1,2"
    >
      <a-plane color="#FFF" height="10" width="10" rotation="45 45 45" position="0 0 0"></a-plane>
    </a-nft>
    <a-entity camera></a-entity>
  </a-scene>
</body>
</html>

了解尺寸、宽度和高度如何真正起作用会很有趣(例如,在文档中,它说尺寸是以米为单位的 nft 尺寸,但这真的很重要吗?那么孩子们呢?)

所以我想知道,我什至需要 AR 吗?实际上,在该壁画中检测图像 A(即相机流)并在其上放置另一个图像 B(或替换它)就足够了,尊重视角。

解决方法

以下内容基于我的经验。

创建 AR 环境的想法是尽可能地模仿现实世界的环境。由于近似值,它永远不会完美,但有一些方法可以帮助算法。其中之一是标记的大小。当使用像相机这样的东西来捕捉现实世界的二维图像时,提取 X 和 Y 坐标是“简单的”,但深度必须从相机移动和物体在二维图像上的位置的相对变化中扣除。标记大小暗示了该特定对象应该有多远,所以我会说标记的大小确实很重要 - 如果您决定指定它。

看看下面的例子:

example

这是一个很好的简化,但尝试想象这两个图像是标记位置的潜在候选者。但是对于指定的尺寸 - 假设您将其设置为比真实物体小 - 相机会选择更近的那个。

解决方案?

据我所知,您不需要指定标记的大小 - 这样就可以让 AR 应用程序计算所有内容。

但您也可以进行测量并输入正确的尺寸以更好地跟踪。

另外,只是一个旁注,如果我错了,请纠正我。通常在 A 帧中,属性用空格分隔而不是 ,。这意味着大小将是 size="1 2" 而不是 size="1,2"。但不要相信我的话,这需要验证。

孩子们呢?

a-nft 实体放置在检测到标记的位置。它的行为与其他所有元素一样,因此其子元素将继承其作为本地空间的位置。这意味着在本地空间中完成的每个转换都将放置在父转换之上。例如,在 A 帧中,position="X Y Z" 在局部空间中执行。

关于重叠图像

如果您正在处理矩形图像,并且想将其投影到矩形墙上,那么我会说您的想法已经足够好了。我认为最直接的方法是检测墙壁的 4 个角并扭曲图像以使角适合(四个角图像扭曲)。如果您只使用矩形元素,这将涵盖透视变换。但是,您仍然必须以某种方式检测到壁画。

但您也可以提前考虑,如果有一天您想增强体验并为场景添加一些深度或 3D,那么您将需要 AR。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...