带有AR标记的Opencv平面检测

Opencv plane detection with AR marker

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

-- 编辑--

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

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

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

如果您尝试放置 2D 图像,在 aruco 代码旁边,有一种更简单的“不是那么 3D”的方式。使用 2D 原始图像 space、cv::aruco::detectMarkers(image, dictionary, corners, ids); 中检测到的 4 个角点,您可以获得从要放入的图像到带有标记 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) 这样的点投影到 2D 图像,并从姿势估计进行 rt 变换。并替换 4 个 2D 点。