首页 文章

形状检测 - 使用OpenCV进行轮廓近似

提问于
浏览
15

我正在为形状检测编写小应用程序 . 首先我需要做的是在图像上找到最重要的形状 . 我从一些预处理开始,包括将图像转换为灰度,阈值和边缘检测 . 下面介绍这些操作之前和之后的图像

之前

enter image description here

enter image description here

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

cvFindContours(crated,g_storage,&contours);

我知道有一个

cvApproxPoly

函数,但是我无法获得此函数结果的任何有用信息 . 有人可以告诉我是否可以计算轮廓的面积或用多边形逼近轮廓 . 也许你有更好的想法如何只提取最重要的形状?

4 回答

  • 8

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

  • 5

    如果你总是有一个受控的背景,我会采取这些步骤(如@damian所建议):

    • Binarization ,即创建诸如background = 0和object regions = 1(或255)之类的图像 . 之后,您的图像上会有几个白色区域 . 有几种方法可以做到这一点,但如果您的背景被控制,您可以使用固定的阈值 . 请注意,您已在此处删除了对象内部的噪音 . 在二进制图像中,您始终可以使用形态学打开/关闭以平滑对象

    • 使用 cvFindContours 查找所有对象:现在应该更容易了 .

    • 使用 cvFloodFill 用背景颜色填充较小的轮廓 .

  • 2

    你的主要问题是塔的轮廓是分散的 . 从那些小碎片中重建整个轮廓将很难 . 优化边缘检测阶段(尝试 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 ));
    

    您需要调整参数 . 它用于检测矩形 .

  • 6

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

相关问题