让代码更简单

OpenCV扫描图像轮廓相关函数中文说明

重要:本文最后更新于2018-11-02 09:13:02,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

FindContours

在二值图像中寻找轮廓

复制
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,
  • CV_CHAIN_APPROX_TC89_KCOS – 应用 Teh-Chin 链逼近算法. CV_LINK_RUNS – 通过连接为 1 的水平碎片使用完全不同的轮廓提取算法。仅有 CV_RETR_LIST 提取模式可以在本方法中应用.
offset
每一个轮廓点的偏移量. 当轮廓是从图像 ROI 中提取出来的时候,使用偏移量有用,因为可以从整个图像上下文来对轮廓做分析.

函数 cvFindContours 从二值图像中提取轮廓,并且返回提取轮廓的数目。指针 first_contour 的内容由函数填写。它包含第一个最外层轮廓的指针,如果指针为 NULL,则没有检测到轮廓(比如图像是全黑的)。其它轮廓可以从 first_contour 利用 h_next 和 v_next 链接访问到。 在 cvDrawContours 的样例显示如何使用轮廓来进行连通域的检测。轮廓也可以用来做形状分析和对象识别 – 见CVPR2001 教程中的 squares 样例。该教程可以在 SourceForge 网站上找到。

OpenCV

OpenCV

StartFindContours

初始化轮廓的扫描过程

复制
CvContourScanner cvStartFindContours( CvArr* image, CvMemStorage* storage,
                                      int header_size=sizeof(CvContour),
                                      int mode=CV_RETR_LIST,
                                      int method=CV_CHAIN_APPROX_SIMPLE,
                                      CvPoint offset=cvPoint(0,0) );
image
输入的 8-比特、单通道二值图像
storage
提取到的轮廓容器
header_size
序列头的尺寸 >=sizeof(CvChain) 若 method=CV_CHAIN_CODE,否则尺寸 >=sizeof(CvContour) .
mode
提取模式,见 cvFindContours.
method
逼近方法。它与 cvFindContours 里的定义一样,但是 CV_LINK_RUNS 不能使用。
offset
ROI 偏移量,见 cvFindContours.

函数 cvStartFindContours 初始化并且返回轮廓扫描器的指针。扫描器在 cvFindNextContour 使用以提取其余的轮廓。

FindNextContour

查找图像的下一个轮廓

复制
CvSeq* cvFindNextContour( CvContourScanner scanner );
scanner
被函数 cvStartFindContours 初始化的轮廓扫描器.

函数 cvFindNextContour 确定和提取图像的下一个轮廓,并且返回它的指针。若没有更多的轮廓,则函数返回 NULL.

SubstituteContour

替换提取的轮廓

复制
void cvSubstituteContour( CvContourScanner scanner, CvSeq* new_contour );
scanner
被函数 cvStartFindContours 初始化的轮廓扫描器 ..
new_contour
替换的轮廓

函数 cvSubstituteContour 把用户自定义的轮廓替换前一次的函数 cvFindNextContour 调用所提取的轮廓,该轮廓以用户定义的模式存储在边缘扫描状态之中。轮廓,根据提取状态,被插入到生成的结构,List,二层 hierarchy, 或 tree 中。如果参数 new_contour=NULL, 则提取的轮廓不被包含入生成结构中,它的所有后代以后也不会被加入到接口中。

EndFindContours

结束扫描过程

复制
 CvSeq* cvEndFindContours( CvContourScanner* scanner );
scanner
轮廓扫描的指针.

函数 cvEndFindContours 结束扫描过程,并且返回最高层的第一个轮廓的指针。

感觉很棒!可以赞赏支持我哟~

2 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐