在过去几年里,我做过的最有趣的项目之一是一个关于图像处理的项目。目标是开发一种能够识别可口可乐“罐”的系统(请注意,我强调的是“罐”这个词,你会在一分钟内看到原因)。您可以看到下面的一个示例,其中可以在绿色矩形中识别,带有缩放和旋转。

项目的一些限制:

背景可能非常嘈杂。罐可以有任何刻度或旋转,甚至可以有方向(在合理的范围内)。图像可能具有一定程度的模糊性(轮廓可能不完全笔直)。图像中可能有可口可乐瓶子,算法应该只检测到罐子!图像的亮度可能会有很大的变化(所以你不能“太依赖”颜色检测)。罐子可以部分隐藏在侧面或中间,也可能部分隐藏在瓶子后面。图像中可能根本就没有罐头,在这种情况下,你必须什么都找不到,然后写一条消息这样说。

所以你可能会遇到这样棘手的事情(在这种情况下,我的算法完全失败了):

我不久前做过这个项目,做得很开心,我有一个不错的实现。以下是关于我的实现的一些细节:

语言:使用OpenCV库在C++中完成。

预处理:对于图像预处理,即将图像转换为更原始的形式以提供给算法,我使用了两种方法:

将颜色域从RGB更改为HSV,并基于“红色”色调进行过滤,饱和度高于一定阈值以避免类似橙色的颜色,低值过滤以避免暗色调。最终的结果是一个黑白二值图像,其中所有的白色像素都将表示符合此阈值的像素。显然,图像中仍然有很多垃圾,但这减少了您必须处理的维度的数量。使用中值滤波(取所有邻居的中值像素值并用该值替换像素)进行噪声滤波,以减少噪声。使用Canny边缘检测滤波器在两个前一步骤后获得所有项目的轮廓。

算法:我为这项任务选择的算法本身取自这本关于特征提取的很棒的书,称为广义霍夫变换(与常规霍夫变换截然不同)。它基本上说了几件事:

你可以在不知道其解析方程的情况下描述空间中的物体(这里就是这种情况)。它可以抵抗图像变形,例如缩放和旋转,因为它基本上会测试图像的缩放因子和旋转因子的每一种组合。它使用算法将“学习”的基础模型(模板)。轮廓图像中剩余的每个像素将根据从模型中获得的信息,投票给另一个像素,该像素可能是对象的中心(按重力计算)。

最后,你会得到一张选票的热图,例如,在这里,罐子轮廓的所有像素都会投票给它的引力中心,所以你会在与中心相对应的同一个像素中获得很多选票,并且会在热图中看到一个峰值,如下所示:

一旦你做到了这一点,一个简单的基于阈值的启发式方法可以为你提供中心像素的位置,你可以从中导出缩放和旋转,然后围绕它绘制你的小矩形(最终的缩放和旋转因子显然是相对于你的原始模板的)。至少在理论上。。。

结果:现在,虽然这种方法在基本案例中有效,但在某些领域严重缺乏:

它非常慢!我没有充分强调这一点。几乎需要整整一天的时间来处理30张测试图像,显然是因为我的旋转和平移比例非常高,因为有些罐子非常小。当瓶子出现在图像中时,它完全丢失了,出于某种原因,几乎总是找到瓶子而不是罐子(可能是因为瓶子更大,因此像素更多,因此投票更多)模糊图像也不好,因为投票结果以像素形式出现在中心周围的随机位置,从而以非常嘈杂的热图结束。在平移和旋转方面实现了差异,但在方向上没有,这意味着没有直接面对摄像机目标的罐子无法被识别。

你能帮我改进我的特定算法吗,专门使用OpenCV特性,来解决上面提到的四个特定问题吗?

我希望有些人也能从中学到一些东西,毕竟我认为不仅仅是提问的人应该学习


如果你不局限于一个不受你限制的相机,也许你可以改用像Xbox Kinect这样的距离传感器。使用此功能,您可以对图像执行基于深度和颜色的匹配分割。这允许更快地分离图像中的对象。然后,您可以使用ICP匹配或类似技术来匹配罐子的形状,而不仅仅是它的轮廓或颜色,如果它是圆柱形的,如果您之前对目标进行过3D扫描,这可能是任何方向的有效选项。这些技术通常很快,特别是用于解决速度问题的特定目的时。

我还建议,不一定是为了准确性或速度,而是为了好玩,你可以在色调分割图像上使用经过训练的神经网络来识别罐子的形状。这些速度非常快,通常可以达到80/90%的准确率。培训需要一个很长的过程,因为您必须手动识别每个图像中的罐。


有趣的问题:当我瞥了一眼你的瓶子图片时,我以为它也是一个罐子。但是,作为一个人,我所做的区别是,我注意到这也是一个瓶子。。。

那么,为了区分罐子和瓶子,先扫描瓶子怎么样?如果你找到了一个,在找罐头之前先把标签遮住。

如果你已经在做罐头,那么实施起来并不太困难。真正的缺点是它使处理时间加倍。(但考虑到现实世界中的应用程序,你最终还是会想做瓶子;-)


这可能是一个非常幼稚的想法(或者根本不起作用),但所有焦炭罐的尺寸都是固定的。因此,如果同一张图片中同时包含一个罐子和一个瓶子,那么你可以根据尺寸来区分它们(瓶子会更大)。现在,由于缺少深度(即3D映射到2D映射),瓶子可能会缩小,并且没有尺寸差异。您可以使用立体成像恢复一些深度信息,然后恢复原始大小。


另一种方法是使用尺度不变特征变换(SIFT)或加速鲁棒特征(SURF)提取特征(关键点)。

您可以在这个页面上找到一个用Java、C++和Python编写的OpenCV代码示例:Features2D+同态查找已知对象

这两种算法对缩放和旋转都是不变的。因为它们与特征一起工作,所以也可以处理遮挡(只要有足够多的关键点可见)。

图像来源:教程示例

SIFT的处理需要几百毫秒,SURF速度更快,但不适合实时应用。ORB使用FAST,FAST在旋转不变性方面较弱。

原始文件

SURF:加速强大功能独特的图像特征来自比例不变关键点ORB:SIFT或SURF的有效替代方案


我会检测红色矩形:RGB->HSV,过滤红色->二值图像,关闭(展开然后侵蚀,在matlab中称为imclose)

然后从大到小看矩形。在已知位置/比例中具有较小矩形的矩形都可以删除(假设瓶子比例恒定,较小的矩形将是瓶盖)。

这会给你留下红色的矩形,然后你需要以某种方式检测标识,以确定它们是红色的矩形还是可乐罐。像OCR,但有一个已知的标志?


查看形状

看看罐子/瓶子红色部分的形状。请注意,罐的顶部略微变细,而瓶的标签是直的。您可以通过比较红色部分的宽度和长度来区分这两者。

查看亮点

区分瓶子和罐子的一种方法是材料。瓶子由塑料制成,而罐子由铝金属制成。在光线充足的情况下,观察镜面反射是区分瓶子标签和罐头标签的一种方法。

据我所知,这就是人类如何区分这两种标签的区别。如果照明条件较差,那么在区分这两个方面肯定会有一些不确定性。在这种情况下,您必须能够检测到透明/半透明瓶子本身的存在。


请看一下Zdenek Kalal的捕食者跟踪器。它需要一些训练,但它可以主动学习被跟踪对象在不同方向和尺度上的外观,并实时进行操作!

源代码可以在他的网站上找到。它在MATLAB中,但也许社区成员已经完成了一个Java实现。我已经成功地在C#中重新实现了TLD的跟踪器部分。如果我没记错的话,TLD使用费尔斯作为关键点检测器。我使用SURF或SIFT(@stacker已经建议)来重新获取被跟踪器丢失的对象。跟踪器的反馈可以很容易地随时间建立一个筛选/冲浪模板的动态列表,随着时间的推移,可以以非常高的精度重新获取对象。

如果你对我的跟踪器的C#实现感兴趣,欢迎提问。


为了加快速度,我会利用这样一个事实,即您不需要找到任意的图像/对象,而是需要找到带有可口可乐标志的图像/物体。这一点非常重要,因为这个标志非常独特,并且在频域中,特别是在RGB的红色通道中,它应该具有特征性的、尺度不变的特征。也就是说,水平扫描线(在水平对齐的徽标上训练)所遇到的从红到白到红的交替图案在穿过徽标的中心轴时将具有独特的“节奏”。这种节奏将在不同的尺度和方向上“加速”或“减速”,但在比例上保持相等。您可以识别/定义几十条这样的扫描线,包括水平和垂直穿过徽标的扫描线以及多条对角的扫描线。称这些为“签名扫描线”

在目标图像中搜索该签名是以水平条扫描图像的简单问题。寻找红色通道中的高频(表示从红色区域移动到白色区域),一旦发现,查看是否跟随训练课程中确定的频率节律。一旦找到匹配项,您将立即知道扫描线在徽标中的方向和位置(如果您在训练过程中跟踪这些内容),因此从那里识别徽标的边界是微不足道的。

如果这不是一个线性有效的算法,或者几乎是这样,我会感到惊讶。它显然不能解决你的罐头瓶歧视问题,但至少你会有你的标志。

(更新:为了识别瓶子,我会在标志附近寻找可乐(棕色液体),也就是瓶子内部。或者,在一个空瓶子的情况下,我会寻找一个帽子,它将始终具有相同的基本形状、大小和与徽标的距离,通常都是白色或红色。搜索一个纯色椭圆形状,帽子应该在哪里,相对于徽标。当然不是万无一失,但你的目标应该是快速找到容易的。)

(我的图像处理时代已经过去几年了,所以我保持了这个建议的高度和概念性。我认为它可能稍微接近人眼的运作方式,或者至少我的大脑是如何运作的!)


即使是人类也很难在第二张图片中区分瓶子和罐子(前提是瓶子的透明区域是隐藏的)吗?

除了一个很小的区域外,它们几乎是一样的(也就是说,罐子顶部的宽度有点小,而瓶子的包装纸整个宽度相同,但有一个小变化,对吗?)

我想到的第一件事是检查瓶子的红色顶部。但是,如果瓶子没有顶部,或者瓶子部分隐藏(如上所述),这仍然是一个问题。

我想到的第二件事是关于瓶子的透明度。OpenCV在查找图像中的透明对象方面有一些工作。检查以下链接。

OpenCV会议记录2012-03-19OpenCV会议记录2012-02-28

特别是看看这个,看看他们如何准确地检测玻璃:

OpenCV会议记录2012-04-24

查看其实施结果:

他们说这是K.McHenry和J.Ponce在CVPR 2006年发表的论文《寻找玻璃的大地测量活动轮廓框架》的实施。

这可能会对你的情况有所帮助,但如果瓶子装满了,问题就会再次出现。

所以我认为在这里,你可以先搜索瓶子的透明主体,或者搜索一个红色区域,该区域与两个透明物体横向连接,这显然就是瓶子。(理想情况下,图像如下。)

现在,您可以删除黄色区域,即瓶子的标签,并运行您的算法来查找罐子。

无论如何,这个解决方案和其他解决方案一样也有不同的问题。

只有当你的瓶子是空的时候,它才起作用。在这种情况下,您必须搜索两种黑色之间的红色区域(如果可口可乐液体是黑色的)。如果透明部分被覆盖,则另一个问题。

但无论如何,如果图片中没有上述问题,这似乎是一个更好的方法。


我不知道OpenCV,但从逻辑上看,我认为你可以通过改变你正在寻找的形象,即可口可乐,来区分瓶子和罐头。你应该一直到罐的顶部,因为如果是罐,可口可乐顶部有银色衬里,而如果是瓶子,则没有银色衬里。

但显然,这种算法在罐头顶部隐藏的情况下会失败,但在这种情况下,即使是人类也无法区分两者(如果只有可乐瓶/罐头的可口可乐部分可见)


我真的很喜欢达伦·库克和斯塔克对这个问题的回答。我当时正在对这些问题发表评论,但我认为我的方法太过简单,不能离开这里。

简而言之,您已经确定了一种算法,以确定可口可乐标志是否存在于空间中的特定位置。现在,您正在尝试确定一个适合于区分可口可乐罐和其他物体的启发式方法,包括:瓶子、广告牌、广告和可口可乐用具,所有这些都与这个标志性标志相关。在你的问题陈述中,你没有提到很多这些额外的案例,但我觉得它们对你的算法的成功至关重要。

这里的秘密是确定一个罐包含哪些视觉特征,或者通过负空间,确定其他可乐产品存在哪些不存在于罐中的特征。为此,当前的顶级答案勾勒出了一个选择“可以”的基本方法,如果且仅当“瓶子”未被识别时,可以通过瓶盖、液体或其他类似的视觉启发法进行识别。

问题是这种故障。例如,一个瓶子可能是空的,没有盖子,导致假阳性。或者,它可能是一个部分瓶子,额外的特征被破坏,再次导致错误检测。不用说,这并不优雅,也不符合我们的目的。

为此,罐的最正确选择标准如下:

你在问题中勾勒出的物体轮廓形状是否正确?如果是,则为+1。如果我们假设存在自然光或人造光,我们是否检测到瓶子的铬轮廓,表明这是否由铝制成?如果是,则为+1。我们确定物体的镜面反射财产相对于我们的光源是正确的吗(光源检测的说明性视频链接)?如果是,则为+1。我们能否确定将对象标识为罐头的任何其他财产,包括但不限于徽标的拓扑图像倾斜、对象的方向、对象的并置(例如,在平面上,如桌子或其他罐头的上下文中)以及拉片的存在?如果是,则每个值+1。

您的分类可能如下所示:

对于每一场候选比赛,如果检测到可口可乐标志的存在,则绘制灰色边界。对于超过+2的每一场比赛,画一个红色边框。

这在视觉上向用户突出显示了检测到的内容,强调了可能被正确检测为破损罐的弱阳性。

每种属性的检测都具有非常不同的时间和空间复杂性,对于每种方法http://dsp.stackexchange.com对于为您的目的确定最正确和最有效的算法来说是非常合理的。我在这里的目的是,纯粹而简单地强调,通过使候选检测空间的一小部分无效来检测某个东西是否是罐头,并不是解决这个问题的最稳健或有效的解决方案,理想情况下,您应该采取相应的措施。

嘿,恭喜黑客新闻发布!总的来说,这是一个非常棒的问题,值得宣传


有一堆颜色描述符用于识别物体,下面的论文对其中的很多进行了比较。当与SIFT或SURF结合时,它们特别强大。仅SURF或SIFT在可口可乐罐图像中不太有用,因为它们不能识别很多兴趣点,您需要颜色信息来帮助。我在一个项目中使用了带有SURF的BIC(边界/内部像素分类),它非常适合识别物体。

Web图像检索中颜色描述符的比较研究


我喜欢你的问题,不管它是否离题:P

有趣的旁白;我刚刚完成了我学位上的一门课程,我们学习了机器人和计算机视觉。我们这学期的项目与你描述的非常相似。

我们不得不开发一种机器人,它使用Xbox Kinect在各种照明和环境条件下检测任何方向的可乐瓶和可乐罐。我们的解决方案包括在色调通道上使用带通滤波器,并结合霍夫圆变换。我们能够稍微限制环境(我们可以选择机器人和Kinect传感器的位置和方式),否则我们将使用SIFT或SURF变换。

您可以在我的博客文章中阅读我们的方法,主题为:)


我喜欢这个挑战,并想给出一个答案,这样可以解决问题。

提取标志的特征(关键点、SIFT、SURF等描述符)将点与徽标的模型图像匹配(使用Matcher,如Brute Force)估计刚体的坐标(PnP问题-SolvePnP)根据刚体估计盖的位置进行反投影并计算瓶盖的图像像素位置(ROI)(我假设你有相机的固有参数)用方法检查盖子是否存在。如果有,那么这就是瓶子

检测瓶盖是另一个问题。它可以是复杂的,也可以是简单的。如果我是你,我会简单地检查ROI中的颜色直方图,以便做出简单的决定。

如果我错了,请给出反馈。谢谢


MVTec有一个名为HALCON的计算机视觉软件包,它的演示可以为您提供好的算法想法。有很多与您的问题类似的示例,您可以在演示模式下运行,然后查看代码中的运算符,看看如何从现有的OpenCV运算符实现它们。

我已经使用这个软件包为类似这样的问题快速原型化复杂的算法,然后找到如何使用现有的OpenCV特性实现它们。特别是对于您的情况,您可以尝试在OpenCV中实现嵌入在运算符find_scaled_shape_model中的功能。一些运营商指出,这篇关于算法实现的科学论文有助于找出如何在OpenCV中做类似的事情。


嗯,我真的觉得我找到了一些东西(这就像是有史以来最有趣的问题——所以,即使找到了一个可以接受的答案,如果不继续尝试找到“完美”的答案,那将是一种耻辱)。。。

一旦你找到了标志,你的麻烦就完成了一半。然后你只需要弄清楚标志周围的东西之间的区别。此外,我们希望尽可能少做额外的工作。我认为这实际上是一个简单的部分。。。

徽标周围是什么?对于罐头,我们可以看到金属,尽管有灯光的影响,但其基本颜色不会发生任何变化。只要我们知道标签的角度,我们就可以知道标签正上方是什么,所以我们要看看它们之间的区别:

在这里,标志的上方和下方是完全黑暗的,颜色一致。在这方面相对容易。

这里,上面和下面的东西都是浅色的,但颜色仍然一致。它是全银的,而且全银金属实际上看起来非常罕见,而且一般都是银色。此外,它有一个很薄的狭缝,距离已经被识别的红色足够近,所以你可以追踪它的整个长度,以计算可以被认为是罐头金属环的百分比。真的,你只需要罐边的一小部分就可以知道它是它的一部分,但你仍然需要找到一个平衡点,确保它不仅仅是一个空瓶子,背后有金属。

最后,这是一个棘手的问题。但不那么棘手,一旦我们只通过我们可以直接在红色包装纸上方(和下方)看到的东西。它是透明的,这意味着它将显示它背后的任何东西。这很好,因为它背后的东西在颜色上不太可能像罐头的银色圆形金属一样一致。它背后可能有很多不同的东西,这会告诉我们它是一个空的(或装满了透明液体)瓶子,或者是一个一致的颜色,这可能意味着它装满了液体,或者瓶子只是在一个纯色的前面。我们使用的是最接近顶部和底部的颜色,正确的颜色出现在正确位置的可能性相对较小。我们知道这是一个瓶子,因为它没有罐的关键视觉元素,与瓶子后面的东西相比,这是相对简单的。

(最后一个是我能找到的最好的一个空的大可口可乐瓶——有趣的是,瓶盖和环是黄色的,表明瓶盖的红色可能不应该被依赖)

在罕见的情况下,瓶子后面有一个类似的银色阴影,即使是在提取塑料之后,或者瓶子里不知怎么充满了相同的银色液体,我们可以回到我们可以粗略估计的银色形状上-正如我所提到的,它是圆形的,遵循罐子的形状。尽管我缺乏图像处理方面的知识,但这听起来很慢。更好的是,为什么不通过检查标志的侧面来推断这一点,以确保没有相同的银色?啊,但是如果罐头后面有同样的银色呢?然后,我们确实需要更加注意形状,再次查看罐子的顶部和底部。

根据这一切需要多么完美,它可能会非常缓慢,但我想我的基本概念是首先检查最简单和最接近的东西。在开始计算其他元素的形状之前,先检查已经匹配的形状周围的颜色差异(这似乎是最微不足道的部分)。要列出它,请执行以下操作:

找到主要吸引人的地方(红色标志背景,可能还有标志本身的方向,但如果罐子被打开,你需要专注于红色)通过非常明显的红色再次验证形状和方向检查形状周围的颜色(因为它快速且无痛)最后,如果需要,验证主要景点周围颜色的形状,以获得正确的圆度。

如果你不能做到这一点,这可能意味着罐子的顶部和底部都被覆盖了,而人类唯一可以用来可靠区分罐子和瓶子的东西就是罐子的遮挡和反射,这将是一场更难处理的战斗。然而,为了更进一步,您可以使用其他答案中提到的半透明扫描技术,跟踪罐子/瓶子的角度来检查更多类似瓶子的特征。

有趣的额外噩梦可能包括一个罐子方便地坐在瓶子后面,距离如此之远,以至于它的金属恰好显示在标签的上方和下方,只要你沿着红色标签的整个长度扫描,这仍然会失败-这实际上是一个更大的问题,因为你没有检测到一个罐子,而不是认为你实际上检测到了一个瓶子,包括偶然发现的罐子。在这种情况下,杯子是半空的!


作为一个免责声明,除了这个问题之外,我在图像处理方面没有任何经验,也从未想过,但它非常有趣,让我对它进行了非常深入的思考,在阅读了所有其他答案后,我认为这可能是完成这项工作的最简单和最有效的方法。就我个人而言,我只是很高兴我实际上不需要考虑编程!

EDIT

此外,看看我在MS Paint中绘制的这幅图。。。这绝对是可怕的,而且相当不完整,但仅根据形状和颜色,你可以猜到它可能会是什么。本质上,这些是人们需要费心扫描的唯一东西。当你看到如此接近的独特形状和颜色组合时,还有什么可能呢?我没有画的那一点,白色背景,应该被认为是“任何不一致的东西”。如果它有一个透明的背景,它几乎可以覆盖任何其他图像,你仍然可以看到它。


作为所有这些好解决方案的替代方案,您可以训练自己的分类器,并使应用程序对错误具有鲁棒性。例如,您可以使用Haar Training,为目标提供大量正面和负面图像。

仅提取罐是有用的,并且可以与透明物体的检测相结合。


深度学习

收集至少几百张包含可乐罐的图像,将其周围的边界框标注为阳性类,包括可乐瓶和其他可乐产品,将其标记为阴性类以及随机对象。

除非您收集了一个非常大的数据集,否则请对小数据集使用深度学习功能。理想情况下,使用支持向量机(SVM)与深度神经网络的组合。

一旦您将图像输入到先前训练的深度学习模型(例如GoogleNet),而不是使用神经网络的决策(最终)层来进行分类,则使用先前层的数据作为特征来训练分类器。

OpenCV和Google Net:http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV和SVM:http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html


如果您对它的实时性感兴趣,那么您需要添加一个预处理过滤器,以确定哪些内容会被重负荷扫描。一个很好的快速、非常实时的预处理过滤器,它可以让你扫描更可能是可口可乐罐的东西,然后再移动到更棘手的东西上,它是这样的:在图像中搜索与可口可乐罐sqrt(pow(红色,2)+pow(蓝色,2)+pow(绿色,2))有一定公差的最大色块。从非常严格的颜色容差开始,然后逐步降低到更宽松的颜色容差。然后,当您的机器人在处理当前帧的分配时间内用完时,它会将当前找到的瓶子用于您的目的。请注意,您必须调整sqrt中的RGB颜色(pow(红色,2)+pow(蓝色,2)+pow(绿色,2)),以使其恰到好处。

此外,这看起来真的很愚蠢,但在编译C代码时,是否确保启用了-oFast编译器优化?


我首先要寻找的是颜色-像红色,当在图像中进行红眼检测时-有一个特定的颜色范围需要检测,考虑到周围区域,例如如果图像中确实可见,与另一只眼睛的距离。

1:第一个特点是颜色,红色非常占优势。在检测到可口可乐红之后,有几个项目值得关注1A:这个红色区域有多大(它有足够的数量来确定一个真正的罐子是否正确-10个像素可能不够),1B:它包含标签的颜色吗?“可口可乐”或波浪。1B1:是否有足够的理由认为它是一个标签。

第1项是一种捷径-如果图像中不存在,请继续。

因此,如果是这样的话,我可以利用我的图像片段,开始稍微缩小问题区域——基本上看周围区域/边缘。。。

2:给定上述图像区域ID为1-验证所讨论项目的周围点[边缘]。A: 有什么看起来像是罐顶或罐底的银吗?B: 瓶子可能看起来是透明的,但玻璃桌也可能是透明的-玻璃桌/架子或透明区域也是如此-如果是这样的话,可能会有多个出口。瓶子可能有一个红色的盖子,它可能没有,但它应该有瓶盖/螺纹螺钉的形状,或者盖子。C: 即使这失败了A和B,它仍然可以是部分的。。当它是部分的时,这会更复杂,因为部分瓶/部分罐看起来可能相同,所以需要对红色区域边缘到边缘的测量进行更多的处理。。小瓶子的大小可能差不多。。

3:经过上述分析后,也就是我会看字母和波浪标志的时候-因为我可以定位搜索单词中的一些字母,因为你可能没有所有的文字,因为没有所有的罐子,波浪将在某些点与文本对齐(距离方向),这样我就可以搜索概率,并知道在距离x处波浪的那个点应该存在哪些字母。


你需要一个从经验中学习和提高分类精度的程序。

我建议深度学习,随着深度学习,这将成为一个微不足道的问题。

您可以在Tensorflow上重新培训inception v3模型:

如何为新类别重新获取Inception的最终层。

在这种情况下,您将训练卷积神经网络来将对象分类为可口可乐罐或非可口可乐罐。


也许已经晚了很多年,但仍然是一个值得尝试的理论。

红色徽标区域的边界矩形与瓶/罐的整体尺寸的比例不同。对于罐,应为1:1,而对于瓶(带或不带盖子)则不同。这应该可以很容易地区分两者。

更新:由于罐和瓶的尺寸不同,标志区域的水平曲率会有所不同。如果您的机器人需要拾取罐/瓶,并且您相应地决定抓握,这可能特别有用。


我回答这个问题晚了几年。在过去的5年里,CNN将最先进的技术推向了极限,我现在不会使用OpenCV来完成这项任务了!(我知道你在这个问题中特别想要OpenCv功能)我觉得与OpenCv功能相比,更快的RCNN、YOLO、SSD等对象检测算法将以显著的优势解决这个问题。如果我现在(6年后)解决这个问题,我肯定会使用更快的RCNN。