注意:本文主要针对各个轮廓均为同一等级的图像。
已知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均为空。
下图为测试图像之一,得出的轮廓顺序如红色数字: