在过去的几年里,我参与过的最有趣的项目之一是关于 image processing 的项目。 .目标是开发一个能够识别可口可乐的系统 ' jar ' (请注意,我在强调“ jar 头”这个词,稍后您就会明白为什么)。您可以在下面看到一个示例,在带有缩放和旋转的绿色矩形中识别出 jar 头。
对项目的一些限制:
所以你最终可能会遇到这样的棘手事情(在这种情况下,我的算法完全失败了):
不久前我做了这个项目,并且从中获得了很多乐趣,而且我有一个不错的实现。以下是有关我的实现的一些详细信息:
语言 : 在 C++ 中使用 OpenCV 完成图书馆。
预处理 :对于图像预处理,即将图像转换为更原始的形式以提供给算法,我使用了两种方法:
算法 :我为此任务选择的算法本身取自 this关于特征提取的很棒的书,名为 Generalized Hough Transform (与常规的霍夫变换非常不同)。它基本上说了几件事:
最后,你会得到一张选票的热图,例如这里 jar 轮廓的所有像素都会投票给它的重心,所以你会在同一个像素对应的中心,并将在热图中看到一个峰值,如下所示:
一旦你有了它,一个简单的基于阈值的启发式可以给你中心像素的位置,从中你可以得出比例和旋转,然后在它周围绘制你的小矩形(最终的比例和旋转因子显然是相对于你的原始模板)。理论上至少...
结果 :现在,虽然这种方法在基本情况下有效,但在某些领域严重缺乏:
你能帮我改进我的具体 算法,使用 独家 OpenCV 功能,解决四具体提到的问题?
我也希望有的人也能从中学到一些东西,毕竟我觉得不是只有提问的人才会学。 :)
最佳答案
另一种方法是使用 scale-invariant feature transform 提取特征(关键点)。 (SIFT) 或 Speeded Up Robust Features (冲浪)。
你可以找到一个不错的OpenCV
Java
中的代码示例, C++
, 和 Python
本页:Features2D + Homography to find a known object
这两种算法对于缩放和旋转都是不变的。由于它们与功能一起使用,您还可以处理 occlusion (只要有足够多的关键点可见)。
图片来源:教程示例
SIFT 的处理需要几百毫秒,SURF 更快一些,但不适合实时应用。 ORB 使用 FAST,它在旋转不变性方面较弱。
原始论文
关于c++ - 图像处理 : Algorithm Improvement for 'Coca-Cola Can' Recognition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168686/