配的内存缓冲区(或显式的通过 cvMemStorageAlloc 函数分配,或隐式的通过 cvSeqPush, cvGraphAddEdge等高级函数分配)
总是起始于当前块(即top块)的剩馀那部分,如果剩馀那部分能满足要求(够分配的大小)。分配后,free_space 就减少了新分配的那部
分内存大小,外加一些用来保存适当列型的附加大小。当top块的剩馀空间无法满足被分配的块(缓冲区)大小时,top块的下一个存储块被
置为当前块(新的top块) -- free_space 被置为先前分配的整个块的大小。
如果已经不存在空的存储块(即:top块已是列尾),则必须再分配一个新的块(或从parent那继承,见 cvCreateChildMemStorage)并
将该块加到列尾上去。于是,存储器(memory storage)就如同栈(Stack)那样, bottom指向栈底,(top, free_space)对指向栈顶。
栈顶可通过 cvSaveMemStoragePos保存,通过 cvRestoreMemStoragePos 恢复指向, 通过 cvClearStorage 重置。
?
?
创建内存块
函数 cvCreateMemStorage 创建一内存块并返回指向块首的指针。起初,存储块是空的。头部(即:header)的所有域值都为 0,除了
block_size 外.
?
cvFindContours
cvFindContours可以得到一个图象所有的轮廓,返回的是轮廓的数量.它可以对cvCanny,cvThreshold(),cvAdaptiveThreshold()函数
处理得到的函数进行轮廓的提取.firstContour参数可以不用创建空间,在函数内部从函数cvFindNextContour返回轮廓的指针.最主要的是
method参数,这个参数涉及轮廓的存储方式,以及什么轮廓能被发现
cvFindContours的第5个参数
CV_RETR_EXTERNAL? ? 查找外边缘,各边缘以指针h_next相连
CV_RETR_LIST? ? ? ? ? ? ? 查找所有边缘(包含内部空洞),各边缘以指针h_next相连
CV_RETR_CCOMP? ? ? ? 查找所有边缘(包含内部空洞),按照如下方式组织
在图像中绘制外部和内部的轮廓。
绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。如果值为2,所有的轮廓。
如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为
abs(max_level)-1的子轮廓。
当thickness>=0,函数cvDrawContours在图像中绘制轮廓,或者当thickness<0时,填充轮廓所限制的区域。
在样本中用1替代 CV_FILLED 以指示的得到外形。
(注意:在cvFindContours中参数为CV_CHAIN_CODE时,cvDrawContours用CV_FILLED时不会画出任何图形)
?其他参数尝试的结果,下面的使用内外都检测 CV_RETR_CCOMP

--------------------------------------分割线 --------------------------------------
--------------------------------------分割线 --------------------------------------