C++ 图像处理:对';可口可乐罐';认可
在过去的几年里,我所从事的最有趣的项目之一是一个关于。我们的目标是开发一个能够识别可口可乐“罐头”的系统(注意,我在强调“罐头”一词,你马上就会明白原因)。您可以在下面看到一个示例,在绿色矩形中可以识别带有缩放和旋转的can 对项目的一些限制:C++ 图像处理:对';可口可乐罐';认可,c++,algorithm,image-processing,opencv,C++,Algorithm,Image Processing,Opencv,在过去的几年里,我所从事的最有趣的项目之一是一个关于。我们的目标是开发一个能够识别可口可乐“罐头”的系统(注意,我在强调“罐头”一词,你马上就会明白原因)。您可以在下面看到一个示例,在绿色矩形中可以识别带有缩放和旋转的can 对项目的一些限制: 背景可能非常嘈杂 罐可以有任何比例或旋转,甚至方向(在合理限制范围内) 图像可能有一定程度的模糊性(轮廓可能不完全笔直) 图像中可能有可口可乐瓶,算法应该只检测罐头 图像的亮度可能会有很大的变化(所以你不能太依赖于颜色检测) 罐子可以部分隐藏在侧面或
- 背景可能非常嘈杂
- 罐可以有任何比例或旋转,甚至方向(在合理限制范围内)
- 图像可能有一定程度的模糊性(轮廓可能不完全笔直)
- 图像中可能有可口可乐瓶,算法应该只检测罐头李>
- 图像的亮度可能会有很大的变化(所以你不能太依赖于颜色检测)
- 罐子可以部分隐藏在侧面或中间,也可以部分隐藏在瓶子后面
- 图像中根本不可能有罐头,在这种情况下,你必须什么也找不到,然后写一条这样的信息
<强>语言< /强>:用C++在库中完成。
预处理:对于图像预处理,即将图像转换为更原始的形式以给出算法,我使用了两种方法:- 您可以在不知道其分析方程的情况下描述空间中的对象(这里就是这种情况)
- 它可以抵抗图像变形,例如缩放和旋转,因为它基本上会测试图像的缩放因子和旋转因子的每个组合
- 它使用算法将“学习”的基础模型(模板)
- 轮廓图像中剩余的每个像素将根据从模型中获得的信息,投票选择另一个像素,该像素应该是对象的中心(就重力而言)
- 非常慢!我强调的还不够。几乎需要一整天的时间来处理30张测试图像,显然是因为我有一个非常高的旋转和平移比例因子,因为有些罐子非常小
- 当瓶子出现在图像中时,它完全消失了,出于某种原因,几乎总是找到瓶子而不是罐子(可能是因为瓶子更大,因此像素更多,投票数也更多)
- 模糊图像也不好,因为投票结果是中心周围随机位置的像素,因此以非常嘈杂的热图结束
- 在平移和旋转方面存在差异,但在方向上不存在差异,这意味着无法识别不直接面对摄影机物镜的罐头
我希望一些人也能从中学到一些东西,毕竟我认为不仅仅是提问的人应该学习。:) 如果你不局限于一台不受限制的相机,也许你可以使用像Xbox这样的距离传感器。使用此功能,您可以对图像执行基于深度和颜色的匹配分割。这样可以更快地分离图像中的对象。然后,您可以使用ICP匹配或类似技术,甚至匹配罐的形状,而不仅仅是其轮廓或颜色。鉴于罐是圆柱形的,如果您之前对目标进行过3D扫描,这可能是任何方向的有效选项。这些技术通常非常快,尤其是用于特定目的时,应该可以解决您的速度问题 我还建议,不一定是为了准确性或速度,但为了好玩,你可以在色调分割图像上使用经过训练的神经网络来识别罐头的形状。这些速度非常快,通常可以达到80/90%的准确度。培训将是一个有点长的过程,虽然你将不得不手动我