如何识别图像中的球,然后对其进行3D建模(鹰眼系统)




我们正在为我们的大学项目开发用于板球的鹰眼系统。鹰眼系统中使用的过程如下:

  1. 从投球手的手到击球手的手(在球的整个飞行过程中(,在不同的时间(不同的点(需要球的图像
  2. 确定球在整个飞行过程中不同时刻的(x,y(坐标
  3. 将所述(x,y(坐标转换为对应的3D坐标(x,y,z(
  4. 模拟球在整个飞行过程中的轨迹,以及球的周围环境,包括场地、球场、三柱门、体育场
  5. 延伸球的轨迹,看看球是否会击中三柱门

到目前为止,这就是我们计划完成的项目:

我们将从腿裁判的位置拍摄击球手的视频,然后在vlc播放器中以慢动作播放视频,同时拍摄多张球的飞行截图,我想这将解决步骤1。

但现在我们陷入了第二步,我们现在面临的问题是如何识别和找到特定情况下球的(x,y(坐标(从腿侧拍摄的球的图像(如果我们能找到球的(x,y(,如果相机离某个参考点的距离已知,那么我们就能找到图像的深度,即z坐标,因此我们可以找到相应的(x、y、z(坐标,然后我们可以使用OpenGL 对其进行3D建模

我们正试图在C++中实现它

感谢任何帮助:(

快速编辑:
我了解到,在真正的鹰眼系统中,板球场的圆周上有6个摄像头,所有摄像头都以60度的角度分开,鹰眼只需使用4个摄像头就可以完美工作,但为了获得更好的精度,额外使用了2个摄像头。由于我们没有那么多相机,我认为我们将使用3个相机,它们被放置在相隔120度的场地周围,为了降低复杂性,我们将选择一个半径为5米的小场地,但我们不确定将相机放置在哪里以获得更准确的结果,可能是位置可能是:一个在腿侧,一个在场外,第三个在正前方,但我仍然不确定该选择的位置

这种方法被称为多摄像机校准,对于球识别,我认为我们应该选择OpenCV而不是MATLAB,因为OpenCV 可以更快地处理图像

你们有什么要说的?

关于步骤2,提取球的位置,有多种可能的方法和文献来源。我强烈建议研究机器人足球(Robocup(的工作,其中包含许多类似问题的例子。

在理想的世界中(比如白背景上的黑色圆盘(,起点可能是使用霍夫变换或轮廓跟踪,并使用所得轮廓的统计矩提取位置。

这种方法的挑战在于,板球场肯定会有难以去除的背景特征。经过一些反复试验,您可以使用常见的图像处理技术,如背景减法、形态学算子、边缘检测器、颜色过滤和阈值处理,以提高您一致查找球的能力。根据过去的经验,我强烈建议使用一套工具,可以快速原型化图像处理管道和技术,可能是MATLAB。

也许用一种更有力的方式来表达这个问题,进入下面的部分,就是如果你知道球之前在哪里,那么你可以在一小段时间后对球应该在哪里做出合理的估计。这是最佳估计和卡尔曼滤波器的领域。一个很好的介绍性文本,尽管来自一个非常不同的问题空间,是Thrun等人的概率机器人。

给你的球一个你不太可能在图像中其他地方找到的颜色,然后在每张图像中寻找该颜色的像素。这是最简单的选择。考虑到板球中球的移动速度,而你只使用每秒30帧的速度,大多数其他选项都要困难得多。仅仅找到一个白色的球是相当困难的(正如你可能发现的那样(,所以你最好的选择是使用前一帧中球的运动信息来帮助在新帧中找到它。然而,低帧速率和高球速意味着你的球会在帧之间移动很多。对于高速碗,在142公里/小时的速度下,你会看到帧之间超过一米的移动,这将导致后续帧之间的球图像之间存在相当大的间隙,这使得使用时间信息变得更加困难。

作为一种奇怪颜色的替代方案,你也可以在球上涂上一层在红外区域高度反射的层,并使用红外灯(人类看不到(和红外敏感相机(你可以为此从相机上取下红外滤镜(。

我想你需要两个摄像头来确定摄像头到球的距离。要么是这样,要么你必须使用一些变通方法,比如查看每帧中球的大小或球与阴影的距离。但我怀疑这两种变通方法是否足够准确。。。

如果你有从图像空间到世界空间的投影/视图矩阵,那么一台相机就足够了(有很多文档需要进行相机校准/坐标转换(。这将获得一个向量,该向量从摄影机指向球。然后可以使用球的大小来确定与摄影机的距离。

我想找到球的最简单方法是引入一个阈值,将球从图像的其余部分"剪切"出来。或者使用运动检测来提取球和/或组合这两种方法。

最新更新