opencv findContours和drawContours()函数解读

opencv中查找图像轮廓的函数是cv::findContours(),并通过cv::drawContours()将查找到的轮廓绘制到图像上。
函数findContour是从二值图像中来计算轮廓的,它可以使用Canny()函数处理的图像,因为这样的图像含有边缘像素;也可以使用threshold()或者adaptiveThreshold()处理后的图像,其边缘隐含在正负区域的交界处。

void cv::findContours(  
    cv::InputOutputArray image, // 输入的8位单通道“二值”图像  
    cv::OutputArrayOfArrays contours, // 包含points的vectors的vector  
    cv::OutputArray hierarchy, // (可选) 拓扑信息  
    int mode, // 轮廓检索模式  
    int method, // 近似方法  
    cv::Point offset = cv::Point() // (可选) 所有点的偏移  
);  
void cv::findContours(  
    cv::InputOutputArray image, // 输入的8位单通道“二值”图像  
    cv::OutputArrayOfArrays contours, // 包含points的vectors的vector  
    int mode, // 轮廓检索模式  
    int method, // 近似方法  
    cv::Point offset = cv::Point() //  (可选) 所有点的偏移  
);  

其中,第一个参数是输入图像,图像的格式是8位单通道的图像,并且被解析为二值图像(即图中的所有非零像素之间都是相等的)。

第二个参数是一个数组的数组,在多数实际的操作中即是STL vectors的STL vector,这里将使用找到的轮廓的列表进行填充(即,这将是一个contours的vector,其中contours[i]表示一个特定的轮廓,这样,contours[i][j]将表示contour[i]的一个特定的端点)。

第三个参数,hierarchy,这个参数可以指定,也可以不提指定。如果指定的话,输出hierarchy,将会描述输出轮廓树的结构信息。
vector<Vec4i> 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])的下一条,前一条,包含的第一条轮廓(第一条子轮廓)和包含他的轮廓(父轮廓)。

第四个参数,轮廓的模式,将会告诉OpenCV你想用何种方式来对轮廓进行提取,有四个可选的值,具体如下图:

cv::RETR_EXTERNAL:表示只提取最外面的轮廓;

cv::RETR_LIST:表示提取所有轮廓并将其放入列表;

cv::RETR_CCOMP:表示提取所有轮廓并将组织成一个两层结构,其中顶层轮廓是外部轮廓,第二层轮廓是“洞”的轮廓;

cv::RETR_TREE:表示提取所有轮廓并组织成轮廓嵌套的完整层级结构。

猜你喜欢

转载自blog.csdn.net/u012456019/article/details/80448898