一.cvFindContours()函数实例
图像分割是图像处理中算是比较核心的部分了,就图像分割方法很多但也很灵活,切忌拘泥于一种算法而套用。图像分割的主要应用是利用一些特性从复杂环境中把需要的目标分割出来处理。比如说交通监制系统把视野中的车辆分割提取出来,从而实现对车辆的监控的。
这里假设已经通过基本的分割方法,得到了图像分割结果的Mask图像。那么,如果从Mask图像中提取各个连通区域并提取相关属性呢。幸运的是opencv 中给我们提供了这些需要的环境。这里要介绍的是cvFindContours()函数的应用。也是查找轮廓,应用比较广主要是因为它的参数容易出彩。
在二值图像中寻找轮廓
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );
-
image
- 输入的 8-比特、单通道图像. 非零元素被当成 1, 0 象素值保留为 0 - 从而图像被看成二值的。为了从灰度图像中得到这样的二值图像,可以使用 cvThreshold, cvAdaptiveThreshold 或 cvCanny. 本函数改变输入图像内容。 storage
- 得到的轮廓的存储容器 first_contour
- 输出参数:包含第一个输出轮廓的指针 header_size
- 如果 method=CV_CHAIN_CODE,则序列头的大小 >=sizeof(CvChain),否则 >=sizeof(CvContour) . mode
-
提取模式.
- CV_RETR_EXTERNAL - 只提取最外层的轮廓
- CV_RETR_LIST - 提取所有轮廓,并且放置在 list 中
- CV_RETR_CCOMP - 提取所有轮廓,并且将其组织为两层的 hierarchy: 顶层为连通域的外围边界,次层为洞的内层边界。
- CV_RETR_TREE - 提取所有轮廓,并且重构嵌套轮廓的全部 hierarchy
-
method
-
逼近方法 (对所有节点, 不包括使用内部逼近的 CV_RETR_RUNS).
- CV_CHAIN_CODE - Freeman 链码的输出轮廓. 其它方法输出多边形(定点序列).
- CV_CHAIN_APPROX_NONE - 将所有点由链码形式翻译(转化)为点序列形式
- CV_CHAIN_APPROX_SIMPLE - 压缩水平、垂直和对角分割,即函数只保留末端的象素点;
- CV_CHAIN_APPROX_TC89_L1,