物体检测+分割

saw*_*dis 15 opencv image image-processing object-detection

我试图找到一种可接受的复杂性的有效方法

  • 检测图像中的对象,以便将其与周围环境隔离开来
  • 将对象分段到其子部分并标记它们,以便我可以随意获取它们

自从我进入图像处理世界已经有3个星期了,我已经阅读过如此多的算法(筛选,蛇,更多蛇,与傅里叶相关等),以及我不知道从何处开始的启发式算法和哪一个算法对于我想要达到的目标来说,它是"最好的".考虑到感兴趣的图像数据集非常大,我甚至不知道是否应该使用在OpenCV中实现的某些算法,或者我是否应该实现自己的算法.

总结:

  • 我应该关注哪种方法?为什么?
  • 我应该将OpenCV用于那种东西,还是有其他"更好"的选择?

先感谢您.

编辑 - 有关数据集的更多信息

每个数据集由共享相同的80K产品图像组成

  • 概念,例如T恤,手表,鞋子
  • 尺寸
  • 方向(90%)
  • 背景(95%)

显然,每个数据集中的所有图片看起来几乎与产品本身完全相同.为了使事情更加清晰,我们只考虑"监视数据集":

集合中的所有图片看起来几乎都是这样的:

在此输入图像描述

(再次,除了手表本身).我想提取表带和表盘.事实上,有许多不同的手表风格,因此形状.从我到目前为止所读到的,我认为我需要一种模板算法,允许弯曲和拉伸,以便能够匹配不同风格的带子和表盘.

而不是创建三个不同的模板(表带的上半部分,表带的下部,表盘),仅创建一个并将其分成3个部分是合理的.这样,我就可以确信每个部件都是相互检测到的,例如在表带的下部不会检测到表盘.

从我遇到的所有算法/方法中,活跃的形状模型似乎是最有希望的.不幸的是,我没有设法找到一个下降实现,我不能确信这是最好的方法,以便继续自己写一个.

如果有人能指出我应该寻找的东西(算法/启发式/库/等),我会非常感激.如果您再次认为我的描述有点模糊,请随时要求更详细的描述.

Aru*_*iRC 8

从你所说的,乍看之下出现的一些东西:

  • 最简单的做法是使用OpenCV或CvBlob库对图像进行二值化并使用Connected Components.对于具有非复杂背景的简单图像,这通常是对象
  • 看看你的样本图像,基于纹理的分割技术可能会更好 - 手表表盘,表带和背景在纹理/粗糙度方面明显不同,这可能是分离它们的理想方式.

    通过特征变换可以很容易地找到部分的粗糙度(在SO上解释一下,检查那里提供的研究论文的链接),然后可以将均值移位滤波器应用于特征变换的输出.这将使区域根据纹理明显分开.通过SVD实现金字塔式Mean Shift和查找特征值都是在OpenCV中实现的,因此除非您能够优化自己的代码,否则就速度和效率而言,更好(更容易)使用内置函数(如果存在).