OpenCV cv::findContours
时间: 2024-04-12 22:25:24 浏览: 74
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。其中,cv::findContours是OpenCV中的一个函数,用于在二值图像中查找轮廓。
cv::findContours函数的基本语法如下:
```
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point())
```
参数说明:
- image:输入的二值图像,通常为灰度图像或二值化后的图像。
- contours:输出的轮廓,每个轮廓由一系列点组成。
- hierarchy:输出的轮廓层级信息,用于描述轮廓之间的关系。
- mode:轮廓检索模式,指定轮廓的检索方式。
- method:轮廓近似方法,指定轮廓的近似方式。
- offset:可选参数,指定轮廓点坐标的偏移量。
cv::findContours函数会根据指定的模式和方法,在输入的二值图像中查找轮廓,并将结果存储在contours和hierarchy中。每个轮廓由一系列点组成,可以通过contours获取每个轮廓的点集。hierarchy用于描述轮廓之间的关系,例如父子关系、兄弟关系等。
相关问题
cv::findContours
cv::findContours函数是OpenCV中用于检测物体轮廓的函数。它可以通过简单几个步骤来检测出物体的轮廓,非常方便。该函数有几个参数,其中第四个参数是mode,用于定义轮廓的检索模式。mode的取值有四种:
1. CV_RETR_EXTERNAL:只检测最外围轮廓,忽略内围轮廓。
2. CV_RETR_LIST:检测所有轮廓,包括内围和外围轮廓,但不建立等级关系。
3. CV_RETR_CCOMP:检测所有轮廓,建立两个等级关系,外围为顶层,内围轮廓归属于顶层。
4. CV_RETR_TREE:检测所有轮廓,建立一个等级树结构,外层轮廓包含内层轮廓。
第五个参数是method,用于定义轮廓的近似方法。method的取值有三种:
1. CV_CHAIN_APPROX_NONE:保存物体边界上所有连续的轮廓点。
2. CV_CHAIN_APPROX_SIMPLE:仅保存轮廓的拐点信息,不保存直线段上的点。
3. CV_CHAIN_APPROX_TC89_L1和CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain近似算法。
cv::findContours用法
cv::findContours是OpenCV中一个非常常用的函数,用于在二值图像中查找轮廓。其语法如下:
```cpp
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point());
```
其中,各个参数的含义如下:
- `image`:输入二值图像,通常为灰度图像或二值化后的图像;
- `contours`:输出的轮廓数组,每个轮廓是一组点的数组,以cv::Mat或std::vector<cv::Point>形式存储;
- `hierarchy`:可选的轮廓层次结构数组,用于存储轮廓间的关系,以cv::Mat或std::vector<cv::Vec4i>形式存储;
- `mode`:轮廓查找模式,可以是`CV_RETR_EXTERNAL`(仅查找最外层轮廓),`CV_RETR_LIST`(查找所有轮廓,但不建立轮廓间的关系)等,具体可参考官方文档;
- `method`:轮廓近似方法,可以是`CV_CHAIN_APPROX_NONE`(保存所有轮廓点),`CV_CHAIN_APPROX_SIMPLE`(仅保存轮廓端点),`CV_CHAIN_APPROX_TC89_L1`和`CV_CHAIN_APPROX_TC89_KCOS`(使用Teh-Chin链逼近算法),具体可参考官方文档;
- `offset`:可选的偏移量,用于指定轮廓相对于原图的位置。
使用cv::findContours函数的基本步骤如下:
1. 将原始图像转为二值图像;
2. 对二值图像进行形态学处理(如膨胀、腐蚀等);
3. 调用cv::findContours函数查找轮廓;
4. 对轮廓进行处理(如绘制、计算轮廓面积等)。
下面是一个简单的示例代码:
```cpp
cv::Mat grayImg, binImg;
cv::cvtColor(srcImg, grayImg, cv::COLOR_BGR2GRAY);
cv::threshold(grayImg, binImg, 0, 255, cv::THRESH_BINARY);
cv::findContours(binImg, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::drawContours(srcImg, contours, -1, cv::Scalar(0, 0, 255), 2);
```
该代码将原始图像转为灰度图像,再二值化得到二值图像,然后使用cv::findContours函数查找轮廓,并绘制出所有轮廓。
阅读全文