2010-04-04 118 views
1

我正在检测任何对象的形状。我有一个二进制图像,背景是白色的,前景/物体是黑色的。我需要检测前景中黑色物体的形状。图像处理中的形状检测

我该怎么办?形状可以是一个人/车/箱等,请帮助

+0

是否需要是规模/旋转不变?这是一款游戏吗?还是必须考虑真实的照片? – 2010-04-04 12:39:27

+0

也许这个问题会得到更多的回应,如果你告诉我们确定形状的最终目标是什么,因为找到某物的形状可能意味着许多不同的事物;形式遵循功能。 – amphetamachine 2010-04-04 13:26:50

回答

2

我不知道这是因为amphetamachine说你的最终目标,但检测的形状可能是使用cvFindContours它给出一个很常见的方法一个二进制图像并返回一组'CvContour'(实际上是一个cvSeq)。通过阈值化图像(cvThreshold)可以非常简单地检索二值图像。查看opencv src目录的示例中的contours.c示例。检查此链接,以及:

Noah (2009) opencv tutorial

此示例代码会给你一个总体思路:

cvThreshold(g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY); 
cvFindContours(g_gray, g_storage, &contours); 
cvZero(g_gray); 
if(contours){ 
    cvDrawContours(
     g_gray, 
     contours, 
     cvScalarAll(255), 
     cvScalarAll(255), 
     100); 
} 
cvShowImage("Contours", g_gray); 

一旦你有轮廓的编码就可以使用cvMatchShapes内搭2个轮廓并返回这些轮廓之间的相似度度量。

希望这种方法为您提供了一个良好的开端!

2

对于准确的形状检测,您需要使用haar检测或至少K个最近的邻居。哈尔检测可能非常准确,但需要很长时间才能建立。 K最近邻居更容易建立,但并不准确。检查出this youtube video。这家伙正在使用KNN来检测不同的手势。请注意,比较图像基本上是一个黑色的斑点。关于KNN的坏处是需要更多的资源来运行程序,但是使用haar检测,当您使用haartraining.exe创建级联xml文件时,已经完成了主要的处理。