图像处理:对'古柯'的算法改进
过去几年中我最感兴趣的项目之一就是一个关于图像处理的项目。 我们的目标是开发一个能够识别可口可乐'罐'的系统 (请注意,我强调'罐'这个词,你会在一分钟内看到为什么。 您可以在下面看到一个示例,其中可以通过缩放和旋转在绿色矩形中识别。
项目的一些限制:
所以你最终可能会遇到这样棘手的事情(在这种情况下,我的算法完全失败):
我前段时间做过这个项目,并且做了很多乐趣,并且我有一个体面的实现。 以下是关于我的实现的一些细节:
语言 :使用OpenCV库在C ++中完成。
预处理 :对于图像预处理,即将图像转换为更加原始的形式以提供给算法,我使用了2种方法:
算法 :我为这项任务选择的算法本身取自这本关于特征提取的精彩图书,并被称为广义霍夫变换(与常规霍夫变换非常不同)。 它基本上说了几件事情:
最后,你会得到一张选票的热图,例如在这里can的轮廓的所有像素都会投票给它的引力中心,所以你将在同一个像素中得到很多投票,这对应于中心,并将在热图中看到一个高峰,如下所示:
一旦你有了这个,一个简单的基于阈值的启发式可以给你的中心像素的位置,从中可以导出比例和旋转,然后绘制你的小矩形(最终比例和旋转因子显然是相对于你的原始模板)。 理论上至少...
结果 :现在,虽然这种方法适用于基本案例,但在一些地区却严重缺乏:
您能否帮助我改进我的特定算法,仅使用OpenCV功能来解决上述四个具体问题?
我希望有些人也会从中学到一些东西,毕竟我不仅认为提出问题的人应该学习。 :)
另一种方法是使用尺度不变特征变换(SIFT)或加速稳健特征(SURF)提取特征(关键点)。
它在OpenCV 2.3.1中实现。
您可以在Features2D + Homography中使用功能找到一个很好的代码示例来查找已知对象
两种算法对缩放和旋转都不变。 由于它们可以处理特征,因此您还可以处理遮挡(只要有足够的关键点可见)。
图片来源:教程示例
SIFT的处理需要几百毫秒,SURF速度更快,但不适合实时应用。 ORB使用对旋转不变性较弱的FAST。
原始文件
为了加快速度,我会利用这样一个事实,即不要求您找到任意图像/对象,但特别是带有可口可乐徽标的图像/对象。 这很重要,因为这个标识非常有特色,并且它在频域中应该有一个特征,尺度不变的特征,特别是在RGB的红色通道中。 也就是说,水平扫描线(在水平对齐的徽标上训练)遇到的红色到白色到红色的交替模式在穿过徽标的中心轴时将具有独特的“节奏”。 该节奏将在不同的尺度和方向上“加速”或“放慢速度”,但仍将按比例相等。 您可以识别/定义几十条这样的扫描线,横向和纵向穿过徽标,还有几个对角线,以星爆图案。 称这些为“签名扫描线”。
在目标图像中搜索此签名是以水平条扫描图像的简单方法。 在红色通道中寻找高频(指示从红色区域移动到白色区域),一旦找到,看它是否跟随在培训课程中确定的一个频率节奏。 一旦找到匹配,您将立即知道扫描线在徽标中的方向和位置(如果您在训练过程中记录了这些事情),那么从中识别徽标的边界是微不足道的。
如果这不是线性有效的算法,或者几乎如此,我会感到惊讶。 它显然没有解决你的罐子歧视问题,但至少你会有你的标识。
(更新:为了识别瓶子,我会在标识附近寻找可乐(棕色液体) - 也就是说,在瓶子内部。或者,如果是空瓶子,我会寻找一个永远有相同的基本形状,大小和距离的标志,通常是全白色或红色。搜索一个纯色eliptical形状的帽子应该是,相对于标志,当然不是万无一失,但你的目标应该是快速找到容易的人。)
(从我的图像处理时代开始已经有几年了,所以我保留了这个高层次和概念性的建议,我认为它可能略微接近人眼可能的运作方式 - 或者至少我的大脑是如何运作的!)
有趣的问题:当我瞥了一下你的瓶子图像时,我认为它也是一个罐子。 但是,作为一个人,我做了什么来区分它,然后我注意到它也是一个瓶子......
因此,要分开罐头和瓶子,先简单扫描瓶子怎么样? 如果你找到一个,在找罐之前掩盖标签。
如果你已经在做罐子,不难实现。 真正的缺点是它会使处理时间加倍。 (但是想想现实世界的应用程序,你最终会想要做瓶子;-)
链接地址: http://www.djcxy.com/p/79565.html