在我之前的问题中,问题是使用opencv找到弯曲的斑马线。现在我认为以下方法会更容易检测它,
(i) 精明的
(ii) 找到其中的轮廓
(iii) 找到其中的黑色条纹,在我的情况下,它的形状略呈椭圆形
现在我的问题是如何找到那个略呈椭圆形的形状?
在此处查看穿越的图像:www.shaastra.org/2013/media/events/70/Tab/422/Modern_Warfare_ps_v1.pdf
在我之前的问题中,问题是使用opencv找到弯曲的斑马线。现在我认为以下方法会更容易检测它,
(i) 精明的
(ii) 找到其中的轮廓
(iii) 找到其中的黑色条纹,在我的情况下,它的形状略呈椭圆形
现在我的问题是如何找到那个略呈椭圆形的形状?
在此处查看穿越的图像:www.shaastra.org/2013/media/events/70/Tab/422/Modern_Warfare_ps_v1.pdf
一般来说,我相信您可以考虑两种方法。
正如您所描述的,一种方法是更强力的图像分析方法。在这里,您将根据对问题的了解应用启发式方法,以识别路径部分中涉及的像素。请注意,这里的“蛮力”并不是一件坏事,只是一个形容词。
另一种方法是应用模式识别技术来找到图像中很有可能成为路径一部分的区域。在这里,您将把图像转换为(希望)有意义的特征:线、点、梯度(例如:定向梯度直方图(HOG))、相对强度(例如:Haar-like features)等,并使用机器学习技术来计算找出这些特征如何描述道路与隧道(在您的示例中)。
当您询问前者时,我将在这里重点讨论。如果您想了解更多关于后者的信息,请浏览 Internet、StackOverflow 或发布您的具体问题。
因此,对于“蛮力图像分析”方法,您的第一步可能是根据需要对图像进行预处理;
如果您稍后要分析颜色,请考虑颜色归一化,这将有助于使您的算法对车库与活动工作室中的照明差异具有鲁棒性。它还将提高对相机协作差异的稳健性,尽管主办比赛的组织会为他们将使用的相机提供规格(不要忽略这一点信息)。
如果您对逐个像素的值(例如边缘)不太感兴趣,而对更大的结构(例如渐变)更感兴趣,请考虑对图像进行模糊处理以减少噪声。
考虑出于模糊的相反原因锐化图像。
对图像预处理做一些研究。这绝对是一个探索的话题,但几乎没有“解决”(不管那意味着什么)。在这个阶段有很多事情要尝试,当然,废话=>废话。
之后,您将要生成一些“功能”..
正如您所提到的,边缘似乎是解决此问题的合适特征空间。不要忘记除了 Canny 之外还有许多其他出色的边缘检测算法(参见Prewitt、Sobel等)。但是,在应用边缘检测算法之后,您仍然只有像素数据。要获得您可能想要从边缘提取线条的功能。这就是霍夫变换空间派上用场的地方。
(另外,作为一个想法,您可以考虑与边缘检测器一起使用的颜色空间。我的意思是,边缘检测器通常在黑白颜色空间中工作,但不是将图像转换为灰度,您可以将其转换为适当的颜色空间并且只使用一个通道。例如,如果游戏板是红色的,而人行横道上的线是蓝色的,则将图像转换为 HSV 并获取色调通道作为边缘检测器的输入。您可能会得到更好的对比度区域不仅仅是灰度。对于明亮与暗淡使用值通道,对于黄色与蓝色使用 Opponent 颜色空间等)
也可以看点。Harris 角点检测器或高斯拉普拉斯算子 (LOG) 等算法将提取“关键点”(每种算法的定义不同,但通常可重现)。
还有许多其他功能空间可供探索,不要停在这里。
现在,这就是蛮力部分的用武之地。
首先想到的是平行线。即使在曲线中,线条的边缘也“大致”平行。您可以轻松地开发一种算法,通过查找每条线大致平行于它们的邻居来找到游戏中的轨迹。请注意,通常应用像霍夫变换这样的线检测器,以便它们在数据集中找到“峰值”或过度表示的角度。因此,如果您为整个图像生成 Hough 变换,您将很难找到您想要的任何线条。相反,您可能希望使用滑动窗口单独检查每个区域。
具体来说,对于弯曲区域,您可以使用 Hough 变换很容易地检测圆形和椭圆。您可以应用启发式方法:两个具有给定半径差异的同心半圆(在您的问题中约为 250)表示一条道路。
如果您使用点/角,您可以尝试提出一种算法来将一条线的角连接到下一条线。您可以限制从一个角到下一个角的距离和旋转角度,这将允许圆角转弯但禁止不可能的路径。这可以阐明道路的边缘,同时对转弯具有鲁棒性。
您现在可能开始明白为什么这些硬编码算法一开始很简单,但调整起来却变得乏味,而且往往没有很好的结果。此外,它们往往僵化且不适用于其他甚至类似的问题。
说了这么多..你说的是解决一个没有开箱即用解决方案的问题。思考解决方案是一半的乐趣,一半的挑战。我在这里描述的一切都是基本的图像分析、计算机视觉和问题解决。开始阅读一些关于这些主题的论文,想法很快就会出现。祝你在比赛中好运。