2011-06-12 356 views
15

我正在为形状检测编写小型应用程序。我首先需要做的是在图像上找到最重要的形状。我从一些预处理开始,包括将图像转换为灰度,阈值和边缘检测。之前这些操作后,图像呈现以下形状检测 - 使用OpenCV进行轮廓逼近

之前

enter image description here

enter image description here

所以后,你可以看到主要的形状是可见的(但它是一个有点散),还有一些噪音(小树等)。我需要做的只是提取最重要的形状(最大的形状) - 在这种情况下,它是一个塔。 我想要做的是在opencv中使用轮廓查找功能,然后以某种方式使用多边形发现contogimate。然后,我会(以某种方式)计算countours的面积,并只选择最大的一个。 到目前为止,我manged(只)用找到的轮廓

cvFindContours(crated,g_storage,&contours); 

我知道有一个

cvApproxPoly 

功能,但我不能得到任何有用的信息,这个函数的结果。 有人可以告诉我是否可以计算轮廓面积或近似多边形轮廓。也许你更清楚如何提取最重要的形状?

回答

5

您的主要问题是塔架轮廓散乱。从这些小块中很难重新创建整个轮廓。优化您的边缘检测阶段(试cvAdaptiveThreshold),或在一块使用不同的方法(可能像object segmentation

之后,你有你的轮廓,你可以检查它的面积是这样的:

CvSeq* convex_hull=cvConvexHull2(contour, storage, CV_CLOCKWISE, 2); 
CvSeq* quad=cvApproxPoly(convex_hull, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0); 
float size=fabs(cvContourArea(quad,CV_WHOLE_SEQ,0)); 

你会需要调整参数。它被用来检测矩形。

8

您不必在此处进行边缘检测。只是阈值二进制图像,然后找到blob(cvFindContours)。您可以在每个返回的CvSeq上使用cvContourArea来查找其区域。

2

你可以使用形态学操作来抑制你的“轮廓噪声”(在你的情况下膨胀)。但是你必须记住形态操作的可用性取决于当前的任务。例如,如果您有两个彼此靠近的对象,则扩展可以从它们中做一个对象。

6

如果你总是有一个控制的背景下,我会去这些步骤(如@damian建议也):

  1. 二值化,即创建图像如背景= 0,对象区域= 1(或255)。之后,你的图片上会有几个白色区域。有几种方法可以做到这一点,但是如果您的背景被控制,您可以使用固定的阈值。请注意,在这里你已经消除了对象内部的噪音。在二进制图像中,您始终可以使用形态学打开/关闭功能来平滑化对象
  2. 使用cvFindContours可以查找所有对象:现在应该更容易。
  3. 使用cvFloodFill填充具有背景色的较小轮廓。
+0

作为二元化过程的一个附件。总是很难找到一个好的阈值。我总是计算一个海图并寻找“低点”。在那里你通常有一个nive阈值。 如果您使用JPEG,此方法可能无法很好地工作。 – 2012-11-29 08:20:08