opencv詳解cvFindContours()中的CV_RETR_LIST
阿新 • • 發佈:2019-01-05
注意:本文主要針對各個輪廓均為同一等級的影象。
已知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儲存輪廓的規律:
- 從影象(0,0)處開始,逐行向下掃描。
- 當在point(x1,y1)處找到第一個輪廓的時候,將該輪廓曲線上的點逐個存入序列seq1。
- 然後重新回到point(x1,y1)處開始掃描,掃描時以某種方式跳過已找到的輪廓。
- 當在point(x2,y2)處找到第2個輪廓時,將該輪廓曲線上的點逐個存入序列seq2;同時在seq1與seq2之間建立聯絡,使得:seq2->h_next==seq1; seq1->h_prev==seq2。
- 以此類推,直到影象的右下角最後一個點
最終,得到n個輪廓。相鄰輪廓滿足seq_high->h_next==seq_low; seq_low->h_prev==seq_high;
且seq1->h_next與seqn->h_prev均為空。
下圖為測試影象之一,得出的輪廓順序如紅色數字: