用于识别图像中对象的对象检测

时间:2016-04-29 11:15:35

标签: opencv image-processing computer-vision tensorflow image-recognition

我想检测图像内容,我需要做的是 发现图像是衬衫还是裤子。

是的,1  enter image description here

是的,2    enter image description here

如果我提供T恤的图像  基于比较形状我需要给定图像是t恤的结果

我尝试的是Harr级联,但它没有给出正确的输出。并且这个样本大小要求太大

4 个答案:

答案 0 :(得分:2)

你正在寻找的东西就是这个。 它会帮助你解决问题

https://github.com/bikz05/bag-of-words

答案 1 :(得分:1)

假设您只想分离仅包含感兴趣对象的图像,您可以使用BOW(视觉词袋),其中图像作为一组特征呈现,然后使用SVM或任何其他分类器进行分类。

您还可以使用特征检测器+描述符+分类器(例如SURF + SVM)。 虽然现在有更强大,更快速的特征探测器......

为了避免培训过程,您甚至可以尝试使用模板匹配(每个大纲)。 提供了一种这样的算法: Fast template matching - Codeproject

Haar级联用于在包含其他内容的图像中进行对象检测,因为它采用滑动窗口检测+它包含在性能和稳健性之间进行权衡的阶段 - 它们很快,但有些对象可能会被遗漏,因为每个阶段都容易发生错误分类错误。

答案 2 :(得分:1)

如果您的图像包含已经分段的对象,如示例所示,您可以创建一个二进制图像,用于指示对象与背景像素。

之后,假设物体一般不会旋转或扭曲,您可以使用简单的功能进行分类。例如,对于上面的情况,只计算有2次前景像素运行的扫描线的百分比。对于衬衫来说这应该是低价值的,对于裤子来说它应该是高的。

显然,如果给定的示例图像不能代表您实际尝试解决的问题,那么这将无法正常工作。

编辑:一些示例matlab代码:

function ratio=TwoRunFeature(I)
    g=rgb2gray(I);
    b=imdilate(g<255,ones(5));
    d=abs(imfilter(b,[-1 1]));
    runs=sum(d,2);
    ratio=sum(runs==2) / sum(runs==1);
end

function TestImage(name)
    I=imread(name);
    fprintf('%s: %f\n',name,TwoRunFeature(I));
end

TestImage('pants.jpg');
TestImage('shirt.jpg');

打印:

pants.jpg: 1.947977
shirt.jpg: 0.068627

裤子的数量和衬衫都很低。只需要你想要的任何地方的门槛就可以了。

答案 3 :(得分:1)

我将假设这两个图像来自您拥有的数据库。 根据我的经验,在这些图像上应用特征(局部描述符)将创建一种人工特征,因为分割或将背景设置为单色。在您的情况下,第二个重点是这些图像可能具有不同的颜色或纹理,并且大多数检测到的特征将来自对象内的区域。这些区域并不重要,与分类无关。 但是,分割图像应该可以使问题更容易。 适合您案例的最佳和最简单的解决方案: 1.通过阈值处理将图像转换为灰度,然后转换为二进制。 2.反转图像,因此背景为黑色,对象为白色。 3.填充孔:如果对象内的任何图像部分为白色,将导致孔洞。 4.现在只检测边界。 由I =扩张的IBinary - IBinary 5.边界样本: 在每个大小为4x4的窗口中仅选择一个非零像素 6.下一步是使用Shape上下文描述符:来描述您的图像。 7.通过使用视觉词袋或稀疏编码,重新表示图像。 8.最大限度地汇集以获得丰富的代表性。 9-SVM