注意:本文主要針對各個輪廓均爲同一等級的圖像。
已知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。
- 以此類推,直到圖像的右下角最後一個點結束掃描;同時將最後一個輪廓的指針seqn賦值給參數列表中的(*fist_contour)。
最終,得到n個輪廓。相鄰輪廓滿足seq_high->h_next==seq_low; seq_low->h_prev==seq_high;
且seq1->h_next與seqn->h_prev均爲空。
下圖爲測試圖像之一,得出的輪廓順序如紅色數字: