我正在编写用于形状检测的小应用程序。我首先需要做的是找到图像上最重要的形状。我从一些预处理开始,包括将图像转换为灰度,阈值和边缘检测。这些操作之前和之后的图像如下所示
在
在
因此您可以看到主要形状是可见的(但它有点散乱)并且还有一些噪音(小树等)。我需要做的是以某种方式提取最重要的形状(最大的形状) - 在这种情况下它是一个塔。 我想要做的是在opencv中使用轮廓查找功能,然后以某种方式使用多边形发现conturs。然后我会(不知何故)计算countours的面积并选择最大的面积。 到目前为止,我(仅)使用
找到轮廓cvFindContours(crated,g_storage,&contours);
我知道有一个
cvApproxPoly
函数,但是我无法获得此函数结果的任何有用信息。 有人可以告诉我是否可以计算轮廓的面积或用多边形逼近轮廓。也许你有一个更好的想法,如何只提取最重要的形状?
答案 0 :(得分:8)
您不必在此处进行边缘检测。只是二进制图像的阈值,然后找到blob(cvFindContours)。您可以在每个返回的CvSeq上使用cvContourArea来查找其区域。
答案 1 :(得分:6)
如果你总是有一个受控的背景,我会采取这些步骤(如@damian所建议):
答案 2 :(得分: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 ));
您需要调整参数。它被用来检测矩形。
答案 3 :(得分:2)
您可以使用形态学操作来抑制“轮廓噪音”(在您的情况下是扩张)。但你必须记住,形态学操作的可用性取决于当前的任务。例如,如果您有两个彼此靠近放置的对象,则扩张可以从它们做一个对象。