Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 图像处理:对';可口可乐罐';认可_C++_Algorithm_Image Processing_Opencv - Fatal编程技术网

C++ 图像处理:对';可口可乐罐';认可

C++ 图像处理:对';可口可乐罐';认可,c++,algorithm,image-processing,opencv,C++,Algorithm,Image Processing,Opencv,在过去的几年里,我所从事的最有趣的项目之一是一个关于。我们的目标是开发一个能够识别可口可乐“罐头”的系统(注意,我在强调“罐头”一词,你马上就会明白原因)。您可以在下面看到一个示例,在绿色矩形中可以识别带有缩放和旋转的can 对项目的一些限制: 背景可能非常嘈杂 罐可以有任何比例或旋转,甚至方向(在合理限制范围内) 图像可能有一定程度的模糊性(轮廓可能不完全笔直) 图像中可能有可口可乐瓶,算法应该只检测罐头 图像的亮度可能会有很大的变化(所以你不能太依赖于颜色检测) 罐子可以部分隐藏在侧面或

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

对项目的一些限制:

  • 背景可能非常嘈杂
  • 罐可以有任何比例或旋转,甚至方向(在合理限制范围内)
  • 图像可能有一定程度的模糊性(轮廓可能不完全笔直)
  • 图像中可能有可口可乐瓶,算法应该只检测罐头
  • 图像的亮度可能会有很大的变化(所以你不能太依赖于颜色检测)
  • 罐子可以部分隐藏在侧面或中间,也可以部分隐藏在瓶子后面
  • 图像中根本不可能有罐头,在这种情况下,你必须什么也找不到,然后写一条这样的信息
因此,您可能会遇到类似这样的棘手问题(在本例中,我的算法完全失败):

我不久前做过这个项目,做起来很有趣,我有一个不错的实现。以下是有关我的实施的一些详细信息:

<强>语言< /强>:用C++在库中完成。

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

  • 将颜色域从RGB更改为,并基于“红色”色调进行过滤,饱和度高于某个阈值以避免类似橙色的颜色,低值过滤以避免暗色调。最终的结果是一个二值黑白图像,其中所有白色像素将表示与该阈值匹配的像素。显然,图像中仍然有很多垃圾,但这减少了你必须处理的维度数量。
  • 噪声过滤使用中值滤波(取所有邻居的中值像素值并用该值替换像素)来减少噪声
  • 在两个先决步骤后,使用获取所有项目的轮廓。
  • 算法:我为这项任务选择的算法本身取自关于特征提取的一本很棒的书,名为(与常规Hough变换截然不同)。它基本上说了几件事:

    • 您可以在不知道其分析方程的情况下描述空间中的对象(这里就是这种情况)
    • 它可以抵抗图像变形,例如缩放和旋转,因为它基本上会测试图像的缩放因子和旋转因子的每个组合
    • 它使用算法将“学习”的基础模型(模板)
    • 轮廓图像中剩余的每个像素将根据从模型中获得的信息,投票选择另一个像素,该像素应该是对象的中心(就重力而言)
    最后,您将得到投票的热图,例如,在这里,can轮廓的所有像素将投票给其重力中心,因此您将在与中心对应的同一像素中拥有大量投票,并将在热图中看到一个峰值,如下所示:

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

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

    • 非常慢!我强调的还不够。几乎需要一整天的时间来处理30张测试图像,显然是因为我有一个非常高的旋转和平移比例因子,因为有些罐子非常小
    • 当瓶子出现在图像中时,它完全消失了,出于某种原因,几乎总是找到瓶子而不是罐子(可能是因为瓶子更大,因此像素更多,投票数也更多)
    • 模糊图像也不好,因为投票结果是中心周围随机位置的像素,因此以非常嘈杂的热图结束
    • 在平移和旋转方面存在差异,但在方向上不存在差异,这意味着无法识别不直接面对摄影机物镜的罐头
    您能否帮助我改进我的特定的算法,使用专门的OpenCV功能来解决所提到的四个特定的问题


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

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

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