边缘检测(下)

作者: iamsonormal2333 | 来源:发表于2017-03-04 00:19 被阅读68次

上一节写的几种方法无法将轮廓表示出来,只能找到轮廓的位置。轮廓可以理解为一系列的点。在OpenCV中,轮廓一般用序列来存储。

查找轮廓

OpenCV中查找轮廓使用cvFindContours()函数。可以将图像用cvCanny()函数或是cvThreshold()函数处理后调用cvFindContours()函数。

      int cvFindContours(
              IplImage * img,
              CvMemStorage * storage,
              CvSeq ** firstContour,
              int headerSize = sizeof(CvContour),
              CvContourRetrievalMode mode = CV_RETR_LIST,
              CvChainApproxMethod method = CV_CHAIN_APPROX_SIMPLE
      );
      

第一个参数是输入图像,图像必须要8为单通道图像,并且应该被转化成二值。第二个参数是内存存储器,接着是指向CvSeq的指针,函数会自动分配,后面则是函数的一些设置。

Freeman链码

一般情况下通过cvFindContours()函数获得的是一系列顶点的序列。另一种不同的表达是设置method参数为CV_CHAIN_CODE,然后生成轮廓,通过Freeman链码方式返回。Freeman链码在每个点上提供八个方向向量,以表示下一个点的位置。可以通过cvStartReadChainPoints()或cvReadChainPoint()函数来读出每个点。

多边形逼近

当我们绘制一个多边形或者进行形状分析的时候,通常需要使用多边形逼近一个轮廓,使得定点数目尽可能少。函数cvApproxPoly()是一种实现。首先在轮廓里选择两个距离最远的点,将这两点连在一起,查找距离这条线段最远的点,将该点加入,并不断的找距离最远的点,如此迭代。

      CvSeq * cvApproxPoly(
            const void * src_seq,
            int header_size,
            CvMemstorage * storage,
            int method,
            double parameter,
            int recursive = 0
      );

轮廓的匹配

比较轮廓最简单的方法是比较轮廓的矩。矩是通过对轮廓上所有的点进行积分运算而得到的一个粗略特征。OpenCV用cvContoursMoments()函数计算矩

      void cvContoursMoments(
                CvSeq * contour,
                CvMoments * moments
      );

第一个参数指向要处理的轮廓,第二个参数指向的结构保存生成的结果。

访问矩的结果使用CvMoments()函数

      double cvGetSpatialMoment(
            CvMoments * moments,
            int x_order,
            int y_order
      );

矩计算给出了一些轮廓的简单属性可以用来比较两个轮廓,但是很多情况下这些并不是最好的参数,更多用到的事归一化的矩。OpenCV提供了计算Hu不变矩和其他归一化矩的函数。具体是cvMoments(),cvGetCentralMoment(),cvGetNormalizedCentralMoment(),cvGetHuMoments()。具体用法这里不列出来了。同时也提供了cvMatchShapes()函数进行Hu矩匹配。

      double cvMatchShapes(
              const void * object1,
              const void * object2,
              int method,
              double parameter
      );

相关文章

  • 边缘检测(下)

    上一节写的几种方法无法将轮廓表示出来,只能找到轮廓的位置。轮廓可以理解为一系列的点。在OpenCV中,轮廓一般用序...

  • opencv+python学习记录(二十)边缘检测

    边缘检测包含:Prewitt边缘检测、Sobel边缘检测、Scharr算子、Canny边缘检测、Laplacian...

  • Canny边缘检测---OpenCV-Python开发指南(22

    什么是Canny边缘检测 Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。该方法由John F. Ca...

  • 计算机视觉实战(六)边缘检测

      这节主要介绍一下Canny边缘检测算法。 基本思想序言   Canny边缘检测算子是John F. Canny...

  • C#:Canny边缘检测

      边缘检测目的是在保留原有图像属性的情况下,显著减少图像的数据规模。  有多种算法可以进行边缘检测,虽然Cann...

  • Opencv第三课---边缘检测

    边缘检测 边缘检测是图像领域非常重要的一种处理手段,要理解边缘检测,首先要理解什么是边缘。边缘是图像局部强度具有非...

  • Task06 边缘检测

    6.1 简介 6.1.1 什么是边缘? 边缘是图像强度函数快速变化的地方 6.1.2 如何检测边缘? 为了检测边缘...

  • cv领域之边缘检测技术学习

    一、边缘检测简单介绍 边缘检测是图像分割中最常见的操作之一,一般提到边缘可能有三个概念: 边缘检测:定位边缘像素的...

  • 图像轮廓(1)

    边缘检测虽然能够检测出边缘,但是边缘不是连续的,检测到的边缘不是一个整体。图像轮廓是指将边缘连接起来形成一个整体 ...

  • 数字图像 - 边缘检测原理 - Sobel, Laplace,

    先来看张图,左边是原图,右边是边缘检测后的图,边缘检测就是检测出图像上的边缘信息,右图用白色的程度表示边缘的深浅。...

网友评论

    本文标题:边缘检测(下)

    本文链接:https://www.haomeiwen.com/subject/fusrgttx.html