【问题标题】:Opencv plane detection with AR marker带有 AR 标记的 Opencv 平面检测
【发布时间】:2020-12-24 00:35:05
【问题描述】:

假设我在桌子上有一个 aruco,我如何使用 aruco 将一个对象(比如图像)放在桌子上来计算桌子平面。我不想将对象放在 aruco 上,而是放在同一平面上(比如在它旁边,在它之前(更靠近观察者)等)。 假设我知道如何检测 aruco 角。这是我正在寻找的另一个表格位置的透视变换。

-- 编辑--

添加我想要实现的示例图像: (请忽略我糟糕的 Photoshop 技能)

现在我知道我可以在名片和 aruco 检测到的角之间使用 opencv 透视变换,但这不会将 b 卡扭曲为方形吗?如何计算桌子上 b 卡的“正确”目的地坐标?所以我会在getPerspectiveTransform(而不是 aruco 角落)中使用它们。

【问题讨论】:

  • 二维码不适合这个。你需要某种真正的增强现实标记。它们与 QR 码的区别在于方形轮廓。二维码没有。

标签: opencv augmented-reality aruco


【解决方案1】:

如果您尝试在 aruco 代码旁边放置一个 3D 对象,只需将对象中心(如 (0,1,0))放置在世界中,aruco 将标记中心假定为世界原点aruco world origin,并使用在您的 3D 渲染设置(如 opengl、ogre 或 Unity3D)中,从姿态估计(solvepnp)作为世界到相机变换的 rt 转换。不要忘记使用您捕获图像的真实相机使用校准参数调整您的相机。如果您不熟悉 3D 渲染,这并不容易,但我相信您可以找到 Unity3D 的一些代码甚至插件。

如果您尝试在 aruco 代码旁边放置 2D 图像,则有一种更简单的“非 3D”方式。使用 2D 原始图像空间中检测到的 4 个角点,cv::aruco::detectMarkers(image, dictionary, corners, ids);,您可以获得从要放入的图像到带有标记的原始源图像的透视变换,Mat cv::getPerspectiveTransform ( InputArray src, InputArray dst, int solveMethod = DECOMP_LU ) 。然后你可以将这个透视变换应用到你想用cv::warpPerspective (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())放进去的图像上。将其叠加到原始图像上。

如果您想要类似标记旁边的东西,只需将 (1,1,0) 之类的点投影到具有来自姿势估计的 rt 变换的 2D 图像。并替换 4 个 2D 点。

【讨论】:

  • 感谢您的回复。为简单起见,假设我想在方形 aruco 旁边放置一个矩形名片图像。 getPerspectiveTransform 不是在两者之间改变名片的纵横比(比如把它变成正方形)?另外,您是否有一些参考资料(或示例),我可以在其中了解什么是“从姿势估计进行 rt 变换”。谢谢!
  • 透视变换是从名片图像空间(假设您有一张名片 200*200,取 4 个角点坐标)到相机捕获的图像空间(也就是您的相机捕获 640*480图像,检测到 aruco 标记和 4 个角坐标)。搜索一些 2D 图像变换的参考。
  • 对于位姿估计的 rt 变换, 这本书对于增强现实来说是一个很好的章节github.com/spmallick/learnopencv/tree/master/…
  • 在问题中添加了更多信息,以更好地解释我想要实现的目标。
  • 查看编辑后的示例图片。这只是我回答的最后一部分“如果你想要类似的东西,在标记旁边,只需将 (1,1,0) 之类的点投影到具有来自姿势估计的 rt 变换的 2D 图像。并替换 4 个 2D 点。”只需在 aruco 角平面的同一平面上制作 4 个角 3D 点。将它们投影到 2D 图像,并获得透视变换
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多