1. 程式人生 > >opencv詳解cvFindContours()中的CV_RETR_LIST

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均為空。

下圖為測試影象之一,得出的輪廓順序如紅色數字: