1803

在过去几年中,我从事的最有趣的项目之一是关于图像处理的项目。目标是开发一个能够识别可口可乐“罐头”的系统(请注意,我强调的是“罐头”这个词,你马上就会明白为什么)。您可以在下面看到一个示例,在带有缩放和旋转的绿色矩形中识别出罐头。

模板匹配

项目的一些限制:

  • 背景可能非常嘈杂。
  • 罐头可以有任何比例旋转甚至方向(在合理的范围内)。
  • 图像可能有一定程度的模糊(轮廓可能不完全笔直)。
  • 图像中可能有可口可乐瓶,算法应该只检测罐头
  • 图像的亮度可能会有很大差异(因此您不能“过多地”依赖颜色检测)。
  • 罐子可以部分隐藏在侧面或中间,也可能部分隐藏在瓶子后面。
  • 图像中可能根本没有罐子,在这种情况下,您必须什么也没找到并写一条消息说。

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

完全失败

不久前我做了这个项目,做起来很有趣,而且我有一个不错的实现。以下是有关我的实现的一些细节:

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

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

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

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

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

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

GHT

一旦你有了这个,一个简单的基于阈值的启发式可以给你中心像素的位置,你可以从中得出比例和旋转,然后在它周围绘制你的小矩形(最终的比例和旋转因子显然是相对于你的原始模板)。至少理论上...

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

  • 非常慢!我没有足够强调这一点。处理这 30 张测试图像几乎需要一整天,显然是因为我有一个非常高的旋转和平移比例因子,因为有些罐子非常小。
  • 当瓶子出现在图像中时它完全丢失了,并且由于某种原因几乎总是找到瓶子而不是罐子(也许是因为瓶子更大,因此有更多的像素,因此有更多的选票)
  • 模糊图像也不好,因为投票最终以像素形式出现在中心周围的随机位置,因此以非常嘈杂的热图结束。
  • 实现了平移和旋转的不变性,但没有实现方向性,这意味着无法识别未直接面向相机目标的罐头。

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

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

4

23 回答 23

734

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

您可以在、和此页面上找到一个很好的OpenCV代码示例: Features2D + Homography to find a known objectJavaC++Python

两种算法对缩放和旋转都是不变的。由于它们与特征一起使用,您还可以处理遮挡(只要有足够多的关键点可见)。

在此处输入图像描述

图片来源:教程示例

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

原始论文

于 2012-04-16T05:17:39.570 回答
422

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

签名扫描线

在目标图像中搜索此签名很简单,只需在水平条中扫描图像即可。在红色通道中寻找高频(表示从红色区域移动到白色区域),一旦找到,看看它后面是否跟着训练课程中确定的频率节奏之一。一旦找到匹配项,您将立即知道扫描线在徽标中的方向和位置(如果您在训练期间跟踪这些内容),因此从那里识别徽标的边界是微不足道的。

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

(更新:为了识别瓶子,我会寻找与标志相邻的可乐(棕色液体)——也就是说,在瓶子里面。或者,如果是空瓶子,我会寻找一个总是有相同的基本形状、大小和与徽标的距离,通常都是白色或红色。相对于徽标,在应有帽子的位置搜索纯色椭圆形。当然不是万无一失,但您的目标应该是快速找到容易的。)

(距离我的图像处理时代已经有几年了,所以我把这个建议保持在高层次和概念性上。我认为它可能稍微接近人眼的运作方式——或者至少是我的大脑的运作方式!)

于 2012-04-17T21:06:00.240 回答
174

有趣的问题:当我看你的瓶子图片时,我还以为它也是一个罐头。但是,作为一个人类,我所做的就是区分这件事,然后我注意到它也是一个瓶子......

那么,要区分罐头和瓶子,先简单地扫描瓶子怎么样?如果你找到一个,在寻找罐头之前遮住标签。

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

于 2012-04-16T05:03:20.650 回答
142

在第二张图像中,即使是人类也很难区分瓶子和罐子(假设瓶子的透明区域被隐藏了)?

除了很小的区域外,它们几乎相同(也就是说,罐头顶部的宽度有点小,而瓶子的包装纸的宽度始终相同,但有细微的变化,对吧?)

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

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

特别看看这个,看看他们检测玻璃的准确度:

查看他们的实现结果:

在此处输入图像描述

他们说这是K. McHenry 和 J. Ponce,CVPR 2006 的论文“A Geodesic Active Contour Framework for Finding Glass”的实现。

这可能对您的情况有一点帮助,但是如果瓶子被装满,问题就会再次出现。

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

在此处输入图像描述

现在您可以移除黄色区域,即瓶子的标签,然后运行您的算法来找到罐头。

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

  1. 只有当你的瓶子是空的时它才有效。在这种情况下,您将不得不搜索两种黑色之间的红色区域(如果可口可乐液体是黑色的)。
  2. 如果透明部分被覆盖,另一个问题。

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

于 2012-04-18T23:02:32.137 回答
54

我真的很喜欢Darren Cookstacker对这个问题的回答。我正在将我的想法投入到对这些的评论中,但我相信我的方法太像答案了,不能离开这里。

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

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

问题是这坏了。例如,一个瓶子可能是空的并且没有盖子,从而导致误报。或者,它可能是一个带有附加功能的部分瓶子,再次导致错误检测。不用说,这并不优雅,也对我们的目的无效。

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

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

您的分类可能如下所示:

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

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

每个属性的检测都具有非常不同的时间和空间复杂度,对于每种方法,快速通过http://dsp.stackexchange.com对于确定最正确和最有效的算法是非常合理的。我的意图纯粹是强调通过使候选检测空间的一小部分无效来检测某物是否是罐头并不是解决此问题的最可靠或最有效的解决方案,理想情况下,您应该采取适当的措施因此。

嘿,祝贺黑客新闻发布!总的来说,这是一个非常棒的问题,值得它受到宣传。:)

于 2012-04-22T22:56:27.607 回答
42

看形状

看看罐头/瓶子的红色部分的形状。注意罐子顶部是如何逐渐变细的,而瓶子标签是直的。您可以通过比较红色部分在其长度上的宽度来区分这两者。

看亮点

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

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

于 2012-04-16T08:31:29.263 回答
38

请查看 Zdenek Kalal 的Predator 追踪器。它需要一些训练,但它可以主动学习跟踪对象在不同方向和比例下的外观,并实时进行!

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

如果您对我的跟踪器的 C# 实现感兴趣,请随时提问。

于 2012-04-17T20:56:15.107 回答
36

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

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

于 2012-04-16T04:54:25.920 回答
25

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

于 2012-04-16T05:13:11.850 回答
25

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

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

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

于 2012-04-16T06:34:38.113 回答
23

嗯,我实际上认为我正在做某事(这就像有史以来最有趣的问题——所以即使找到了一个可以接受的答案,如果不继续尝试找到“完美”的答案,那将是一种耻辱).. .

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

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

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

在这里,上面和下面的东西很轻,但颜色仍然一致。它是全银的,而且全银金属实际上看起来非常罕见,一般来说也是银色。此外,它在一个薄薄的滑行中,并且与已经识别的红色足够接近,因此您可以追踪其整个长度的形状,以计算可以被认为是罐头金属环的百分比。真的,你只需要在罐子上的任何地方占一小部分就可以看出它是其中的一部分,但你仍然需要找到一个平衡点,以确保它不仅仅是一个空瓶子,后面有金属东西。

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

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

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

取决于这一切需要多么完美,它可能会很慢,但我想我的基本概念是首先检查最简单和最接近的东西。在努力计算其他元素的形状之前,先检查已经匹配的形状周围的颜色差异(无论如何这似乎是最微不足道的部分)。列出它,它是:

  • 找到主要的吸引力(红色标志背景,可能还有标志本身的方向,但如果罐子被转开,你需要只专注于红色)
  • 再次通过非常独特的红色验证形状和方向
  • 检查形状周围的颜色(因为它快速且无痛)
  • 最后,如果需要,验证主要景点周围的颜色形状是否正确。

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

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


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

编辑

用 MS 油漆画的罐子不好 此外,看看我在 MS Paint 中绘制的这幅图……它非常糟糕而且非常不完整,但仅根据形状和颜色,你就可以猜出它可能会是什么。从本质上讲,这些是唯一需要费心扫描的东西。当您如此近距离地观察那非常独特的形状和颜色组合时,它还能是什么?我没有画的那一点,白色背景,应该被认为是“任何不一致的东西”。如果它有一个透明的背景,它几乎可以覆盖任何其他图像,你仍然可以看到它。

于 2014-07-12T16:12:27.487 回答
18

我不知道 OpenCV,但从逻辑上看问题,我认为您可以通过更改您正在寻找的图像(即可口可乐)来区分瓶子和罐头。你应该加入直到罐头的顶部,因为在罐头的情况下,可口可乐顶部有银色衬里,如果是瓶子,则没有这样的银色衬里。

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

于 2012-04-19T07:15:46.100 回答
17

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

于 2018-03-16T04:18:02.800 回答
16

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

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

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

如果我错了,请提供反馈。谢谢。

于 2013-09-24T14:14:11.817 回答
13

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

一个有趣的旁白;我刚刚完成了我的学位课程,其中涵盖了机器人技术和计算机视觉。我们本学期的项目与您描述的项目非常相似。

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

您可以在我关于该主题的博客文章中了解我们的方法:)

于 2013-01-04T06:10:22.317 回答
12

深度学习

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

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

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

OpenCV 和谷歌网络: 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

于 2017-05-08T19:27:00.340 回答
11

有一堆用于识别物体的颜色描述符,下面的论文比较了很多。当与 SIFT 或 SURF 结合使用时,它们特别强大。单独的 SURF 或 SIFT 在可口可乐罐图像中不是很有用,因为它们不能识别很多兴趣点,您需要颜色信息来提供帮助。我在一个项目中使用 BIC(边界/内部像素分类)和 SURF,它在识别物体方面效果很好。

用于 Web 图像检索的颜色描述符:一项比较研究

于 2013-01-03T15:26:41.543 回答
11

您需要一个从经验中有机地学习和提高分类准确性的程序。

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

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

如何为新类别重新训练 Inception 的最后一层

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

于 2017-09-08T17:46:46.887 回答
7

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

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

于 2014-12-04T06:39:28.270 回答
5

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

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

于 2014-04-09T23:40:43.773 回答
2

Maybe too many years late, but nevertheless a theory to try.

The ratio of bounding rectangle of red logo region to the overall dimension of the bottle/can is different. In the case of Can, should be 1:1, whereas will be different in that of bottle (with or without cap). This should make it easy to distinguish between the two.

Update: The horizontal curvature of the logo region will be different between the Can and Bottle due their respective size difference. This could be specifically useful if your robot needs to pick up can/bottle, and you decide the grip accordingly.

于 2018-02-05T19:33:18.830 回答
1

如果您对它是实时的感兴趣,那么您需要添加一个预处理过滤器以确定使用重型材料扫描的内容。一个很好的快速、非常实时的预处理过滤器,可以让您扫描更可能是可口可乐罐的东西,而不是在移动到更多不确定的东西之前:搜索图像以查找最大的补丁与sqrt(pow(red,2) + pow(blue,2) + pow(green,2))可口可乐罐有一定公差的颜色。从非常严格的颜色容差开始,然后逐步降低到更宽松的颜色容差。然后,当您的机器人用完分配的时间来处理当前帧时,它会将当前找到的瓶子用于您的目的。请注意,您必须调整 RGB 颜色sqrt(pow(red,2) + pow(blue,2) + pow(green,2))以使它们恰到好处。

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

于 2017-05-12T22:07:26.340 回答
1

我要寻找的第一件事是颜色 - 类似 RED ,在图像中进行红眼检测时 - 有一定的颜色范围要检测,考虑到周围区域的一些特征,例如与另一只眼睛的距离,如果它在图像中确实可见。

1:第一个特征是颜色,红色非常占优势。检测到可口可乐红后,有几个感兴趣的项目 1A:这个红色区域有多大(它的数量是否足以确定真罐 - 10 个像素可能不够),1B:它是否包含标签的颜色 - “可口可乐”或波浪。1B1:是否足以考虑它是标签的高概率。

第 1 项是一种捷径——如果图像中不存在这种情况,则进行预处理——继续前进。

因此,如果是这种情况,我可以利用我的图像的那部分并开始查看更多缩小问题区域 - 基本上查看周围区域/边缘......

2: Given the above image area ID'd in 1 - verify the surrounding points [edges] of the item in question. A: Is there what appears to be a can top or bottom - silver? B: A bottle might appear transparent , but so might a glass table - so is there a glass table/shelf or a transparent area - if so there are multiple possible out comes. A Bottle MIGHT have a red cap, it might not, but it should have either the shape of the bottle top / thread screws, or a cap. C: Even if this fails A and B it still can be a can - partial.. This is more complex when it is partial because a partial bottle / partial can might look the same , so some more processing of measurement of the Red region edge to edge.. small bottle might be similar in size ..

3:经过上述分析后,我会查看字母和波浪徽标 - 因为我可以定向搜索单词中的一些字母因为您可能没有所有文本,因为没有所有的可以,波浪会在某些点与文本对齐(距离方面),所以我可以搜索那个概率并知道在距离 x 的那个点处应该存在哪些字母。

于 2017-09-04T11:40:21.690 回答