查找与绘制轮廓
一个轮廓一般对应一系列点,即一条曲线。在OpenCV中,可以用findContours()函数从二值图像查找轮廓。
- image:输入图像。8-bit的单通道二值图像,非零的像素都会被当作1。
- contours:检测到的轮廓。是一个向量,向量的每个元素都是一个轮廓。因此,这个向量的每个元素仍是一个向量。vector<vector > contours;
- hierarchy:各个轮廓的继承关系。hierarchy也是一个向量,长度和contours相等,每个元素和contours的元素对应。hierarchy的每个元素是一个包含四个整型数的向量。即:
vector hierarchy; // Vec4i is a vector contains four number of int
hierarchy[i][0],hierarchy[i][1],hierarchy[i][2],hierarchy[i][3],分别表示的是第i条轮廓(contours[i])的下一条,前一条,包含的第一条轮廓(第一条子轮廓)和包含他的轮廓(父轮廓)。 - mod: 检测轮廓的方法。有四种方法。
method:表示一条轮廓的方法。 - offset:可选的偏移,就是简单的平移,特别是在做了ROI步骤之后有用
检测轮廓方法(mod):
-
CV_RETR_EXTERNAL:只检测外轮廓。忽略轮廓内部的洞。
-
CV_RETR_LIST:检测所有轮廓,但不建立继承(包含)关系。
-
CV_RETR_TREE:检测所有轮廓,并且建立所有的继承(包含)关系。用CV_RETR_EXTERNAL和CV_RETR_LIST方法hierarchy变量是没用的,因为前者没有包含关系,找到的都是外轮廓,后者仅仅是找到所有的轮廓但并不把包含关系区分。用TREE这种检测方法的时候我们的hierarchy这个参数才是有意义的。事实上,应用前两种方法的时候,我们就用findContours这个函数的第二种声明了。
-
CV_RETR_CCOMP:检测所有轮廓,但是仅仅建立两层包含关系。外轮廓放到顶层,外轮廓包含的第一层内轮廓放到底层,如果内轮廓还包含轮廓,那就把这些内轮廓放到顶层去。
表示一条轮廓的方法(method):
-
CV_CHAIN_APPROX_NONE:把轮廓上所有的点存储。
-
CV_CHAIN_APPROX_SIMPLE:只存储水平,垂直,对角直