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