如何使用计算机视觉根据位置坐标找到足球场的角落?

人工智能 算法 计算机视觉 matlab
2021-11-09 01:54:10

我想使用计算机视觉让我的机器人根据当前位置检测足球场的角落。Matlab 有一个 detectHarrisFeatures 功能,但我相信它只适用于 2D 映射。

我想尝试的方法是收集线的信息(使用线检测),将它们存储在直方图中,然后根据它们的角度查看线相交的位置。

我的问题是:

  1. 我怎么知道线在哪里相交?
  2. 如何使用计算机视觉找到线条的角度?
  3. 如何根据我的坐标更新此信息?

我正处于这项任务的开始阶段,因此非常感谢任何指导!

3个回答

在图像中查找线通常会导致霍夫线变换。许多库都实现了它,包括OpenCV获取线路应该回答后续问题(它不会,请考虑每个帖子有一个问题,StackExchange 上的其他一些站点可能比 AI.SE 更适合)

也可能存在基于机器学习的替代方法。在这一点上研究进行人体姿势/步态识别的库可能会很有趣。假设字段外部标记与其“步态”等效,则某些库可能会重新用于识别“字段步态”。

我假设您熟悉齐次变换以及全局局部坐标系的含义。如果不是,则全局坐标系为固定坐标系;整个问题的参考框架,例如机器人的起始位置。局部框架应放置在机器人的任何位置,最好是连接机器人后部的两个驱动轮的虚拟线(称为“机器人底座”)的中点(假设您遵循差动驱动设置)。如果没有,只需将局部框架放置在对机器人有意义的任何位置,例如其几何中心。

回答您的问题:

我怎么知道线在哪里相交?

迄今为止,公认的答案所见过的最好的答案,我也成功地将其用于一个关于机器人在未知迷宫中探索的项目。

如何使用计算机视觉找到线条的角度?

不需要计算机视觉。对于每条线,选取以全局框架 (x1,y1),(x2,y2) 表示的 2 个点,然后将线的斜率计算为:

lambda = (y2-y1) / (x2-x1)

那么线的角度是atan(lambda),在全局框架中。对所有线执行此操作,然后减去任何两条线的角度以找到它们的相对角度(注意符号)。

或者,我个人会使用RANSAC算法对检测到的点进行去噪,并根据所有点的一致性给出线方程。这个线方程应该已经有斜率了:

y = ax + b

其中a是斜率,b是垂直偏移。然后执行上述步骤,即 atan(a) 和减法以找到两条线之间的相对角度。

如果你明确地想使用计算机视觉,也许可以在已知角度上训练一个神经网络,然后对线条图像进行分类以输出它们的角度。这种方法将是迄今为止最痛苦的,我根本不推荐它。

如何根据我的坐标更新此信息?

这可能非常棘手。如果您的车载相机检测到线点,您首先需要将它们从相机的坐标系(在相机的数据表中找到)转换为机器人的本地坐标系,如上所述。为此,您需要计算两帧之间的静态变换(静态的,因为如果相机固定在机器人上,它永远不会改变,您只需定义一次)。

然后,您需要将检测到的线方程从机器人的框架转换为全局框架。为此,您需要跟踪机器人在 2D 或 3D 空间中移动时的姿势(位置 + 方向)。这通常是一项艰巨的任务,因为它需要您的定位算法的出色实现,例如扩展卡尔曼滤波器或粒子滤波器。定位算法将在任何时间点为您提供所需的信息,以便将机器人框架中的线/点转换为全局框架并将它们可视化。

简而言之:您需要从相机框架 -> 机器人(本地)框架 -> 全局框架转换检测到的线/点。第一个转换是静态的(计算一次并且永远不会改变),而第二个转换是动态的(每次机器人移动或转动时都会改变)。第一个相当容易计算,但第二个可能真的很痛苦。

我建议您首先考虑您的坐标系。那里有两个。

场坐标轴

场边界角位于场坐标中(例如):{ (-50.0, -35.0, 0), (50.0, -35.0, 0), (-50.0, -35.0, 0), (50.0, -35.0, 0) },所有值以米为单位。

在任何时刻,机器人中的摄像头:位于 (x, y, z) 处,相对于北方的角度为 theta,从场地上方看时顺时针测量。z 的值可以是 2.0(例如)。

图像坐标轴

相机图像的坐标轴是(w,h)。您有时间帧(可能每 33 毫秒包含 wh 坐标轴中的网格,例如 1080 x 960 像素),提供索引范围(<0, 1079>, <0, 959>)。

保持短机器人的方向(小 Z)

您是正确的,Harris 特征检测可能不起作用,因为 z(从场地表面到相机镜头中心的距离)可能不足以用于该算法,除非机器人靠近角落。场边界的矩形在相机的 wh 焦平面上根本不是矩形。出于同样的原因,找到线然后定位它们的交叉点也不是最佳方法。

假装你是机器人。作为机器人勘测的领域,它可以组装一个360度周边的模型。它看到的是一条逐渐弯曲的曲线,三个倒置的 v 形代表场角。除非机器人几乎位于其中一个角的顶部,否则与场地边界角对应的所有四个特征都只会隐约出现在角上。

钝角检测的数学

每个角都有两条切线。它们相交于直线导数 dw/dh 的不连续处,即相机帧的 2D 相空间中的斜率。在这两条切线之间发现的角度通常比 90 度更接近 175 度,但它们仍然可以检测到,因为线的其余部分没有其他类似的坡度不连续性。从傅立叶变换的角度来看,360 度线实际上是一个周期波形,主要由 4 次、12 次、20 次、28 次和 36 次谐波组成。如果您擅长该级别的数学并记录过去的帧,则可以利用傅里叶级数和 FFT 来实现角点检测的高精度。

当您开发您的理论和您的软件时,您可能会发现需要考虑游戏的其他方面。现在最好考虑这些方面。幸运的是,如果另一名球员或官员挡住了场地边界线的一部分,它将在边界线本身中产生不连续性,但不会在摄像机图像的 wh 平面中产生线的斜率。您的实现将需要区分这两种类型的差异,这几乎不是一个无法克服的问题。一条线的不连续性和它的导数的不连续性在数学上自然是不同的。

反馈渠道的冗余

如果机器人可以通过其他方式感知自己的位置和方向,并以一定的可靠性知道上面的 x、y、z 和 theta,则可以将钝角的预期位置与检测到的钝角进行比较,以确定机器人正确检测方向。

在这种情况下的问题

在这种情况下,您列出的问题需要重新定位。

我怎么知道线在哪里相交?

在许多情况下,这条线有两条可能位于同一像素上的边缘,因此在具有许多其他线的图像中不容易检测到。如果线条具有特定颜色,则色调检测可以辅助线条检测。如果采用上述佐证性数据分析,则可以实时快速纠正对边缘的误解。一旦找到线,就可以使用线段和窗口的线性回归(一次查看一个短线段)来估计线上任何给定点的 dh/dw 检测。当一个相对稳定的斜率在窗口之间快速移动 5 或 10 度时,您很有可能找到了一个远场角。帧中 70 到 80 度的偏移以及较低的 h 值表明角落非常接近。

如何使用计算机视觉找到线条的角度?

边缘检测,系统地消除不太可能是场边界的候选边缘,然后对最佳候选边缘进行线性回归。

如何根据我的坐标更新此信息?

只需将它们保存在由帧号索引的 x、y、z、theta 向量的适当数组中。您可能想要跟踪您认为机器人的 x、y、z 和 theta 值是什么,并根据您最近的输入不断测试您的假设。否则,您的机器人可能会迷失方向。检测位置和方向的方法越多,整个系统的可靠性就越高。如果您的视力可以在每个目标上检测到在比赛期间不会改变的某些特征,那么它可能会有所帮助。最终,您的 x、y、z 和 theta 是模型中的参数,需要应用梯度下降和自相关以及其他自动校正技术来保持机器人的方向模型不断更新。

建议先潜入数学

如果研究人员首先开发一些清晰的图表,然后花时间恢复任何生锈的数学技能或磨练一些新技能,那么详细处理上述所有内容的 3D 三角学最初是令人生畏的,但与高中三角学相差不远。