【发布时间】:2023-03-13 17:03:01
【问题描述】:
我正在尝试使用 8 个 aruco 标记、opencv 和 python 来检测棋盘。标记检测工作正常,但是一旦玩家移动,通常至少有一个标记会被他们的手臂覆盖。由于仍然可以检测到大多数标记,因此应该可以在给定其他标记位置的情况下估计该点。为了说明我的设置,我链接了一张图片。 Correct Marker Points
我第一次尝试预测缺失点是尝试计算从世界到图像空间的未知转换矩阵。为了表示 8 个标记角位置,世界空间坐标 [1,0,0], [1,50,0], [1,75,0], [1,100,0], [1,0,100], [1,使用了 0,50]、[1,75,100] 和 [1,100,100]。因此,这些总是已知的并由矩阵 W 表示。标记点的屏幕空间坐标由 opencv 计算并由矩阵 S 表示。为了论证,假设没有检测到一个标记并且需要估计该点。然后为给定的 7 个点计算从 W 到 S 的变换矩阵(即为 X 求解 W * X = S),并为估计缺失点,将世界空间坐标乘以 X。问题是 X 不包含透视变换,因此错误地投影估计点。为了说明这一点,连接了第二张图片,其中所有点都被正确检测到,但随后被投影矩阵 X 投影。 Incorrect Marker Points
python 代码的快速 sn-p 显示如何计算 X 和投影点:
ids = [81,277,939,275,683,677,335,981]
corner_world_coord = {
683: [1,0,0],
275: [1,50,0],
939: [1,75,0],
81: [1,100,0],
335: [1,0,100],
677: [1,50,100],
277: [1,75,100],
981: [1,100,100]
}
W = [corner_world_coord[i] for i in ids]
S = [aruco_corners[i] for i in ids]
X, res, _, _ = np.linalg.lstsq(W,S)
estimate = np.zeros(len(ids))
for idx, corner in enumerate(W):
estimate[idx] = np.dot(corner,X)
X 的最小二乘误差计算的残差始终等于 0。因此,我的问题是,在给定多个其他点的世界空间和屏幕空间坐标的情况下,有没有办法计算缺失点的屏幕坐标?
【问题讨论】:
-
Aruco 还返回旋转
rvec和平移tvec向量,允许将对象帧中表示的3D 点转换为相机帧。每个标记点都在一个全局对象框架中表示。如果未检测到标记,您可以使用其他标记姿势之一转换标记坐标,然后使用内部参数将其投影到图像平面。 -
由于您有多个标记,您将有多个
rvec和tvec。也许您需要在参考框架/全局对象框架中转换所有内容。有关camera frame 和homogeneous transformation 的更多信息,请参阅同构变换和文档。
标签: python numpy opencv linear-algebra