opencv详解cvFindContours()中的CV_RETR_LIST

注意:本文主要针对各个轮廓均为同一等级的图像。

已知cvFindContours()函数形式如下:

int cvFindContours(
    IplImage*       img,
    CvMemStorage*   storage, 
    CvSeq**         first_contour,    
    int             header_size=sizeof(CvContour),    
    int             mode=CV_RETR_LIST,    
    int             method=CV_CHAIN_APPROX_SIMPLE,    
    );

经多组图像数据测试,猜测得出cvFindContours()寻找轮廓以及CV_RETR_LIST保存轮廓的规律:

  1. 从图像(0,0)处开始,逐行向下扫描。
  2. 当在point(x1,y1)处找到第一个轮廓的时候,将该轮廓曲线上的点逐个存入序列seq1。
  3. 然后重新回到point(x1,y1)处开始扫描,扫描时以某种方式跳过已找到的轮廓。
  4. 当在point(x2,y2)处找到第2个轮廓时,将该轮廓曲线上的点逐个存入序列seq2;同时在seq1与seq2之间建立联系,使得:seq2->h_next==seq1; seq1->h_prev==seq2。
  5. 以此类推,直到图像的右下角最后一个点结束扫描;同时将最后一个轮廓的指针seqn赋值给参数列表中的(*fist_contour)。

最终,得到n个轮廓。相邻轮廓满足seq_high->h_next==seq_low; seq_low->h_prev==seq_high;

seq1->h_nextseqn->h_prev均为空。

下图为测试图像之一,得出的轮廓顺序如红色数字:

                                                                           

猜你喜欢

转载自blog.csdn.net/Beast_Liu/article/details/84842533