findcontour
时间: 2023-08-21 15:15:41 浏览: 31
cv::findContours()是OpenCV中的一个函数,用于在图像中查找轮廓。轮廓是表示图像中曲线的点的列表,可以根据实际情况以不同的方式表示。在使用cv::findContours()函数时,一般需要将图像转换为灰度图像,并通过边缘提取算法(如Canny)获得二值图像。然后使用cv::findContours()函数来寻找轮廓,并使用cv::drawContours()函数将轮廓绘制在图像上。通过调整边缘提取算法的阈值选定,可以影响最终轮廓的发现结果。
相关问题
cv2.findContour
cv2.findContours() 是 OpenCV 中用来查找图像中的轮廓的函数。它的语法如下:
contours, hierarchy = cv2.findContours(image, mode, method)
- image:输入的二值图像,通常是灰度图像或二值化后的图像。
- mode:轮廓检索模式,指定轮廓的层级关系。常用的模式有:
- cv2.RETR_EXTERNAL:只检测外部轮廓。
- cv2.RETR_LIST:检测所有轮廓,不建立层级关系。
- cv2.RETR_TREE:检测所有轮廓,并建立完整的层级关系。
- method:轮廓逼近方法。常用的方法有:
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
- cv2.CHAIN_APPROX_SIMPLE:仅存储轮廓的端点。
函数返回两个值:contours 和 hierarchy。
- contours:包含所有检测到的轮廓的列表。
- hierarchy:包含轮廓之间层级关系的数组。
注意,cv2.findContours() 函数会修改输入图像,因此如果需要保留原始图像,建议先进行拷贝操作。
findcontour的参数以及例子
findContours函数的参数如下:
```
cv::findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point())
```
参数解释如下:
- `image`: 输入二值化图像,这个图像中的非零像素点都会被视为轮廓点。
- `contours`: 输出参数,包含所有检测到的轮廓,每个轮廓都是一个由点组成的向量。
- `hierarchy`: 输出参数,包含所有轮廓的拓扑信息,可以用来确定轮廓之间的关系。
- `mode`: 表示轮廓检测模式,有以下四种取值:
- `RETR_EXTERNAL`: 只检测最外层轮廓。
- `RETR_LIST`: 检测所有轮廓,但不建立轮廓层次结构。
- `RETR_CCOMP`: 检测所有轮廓,并将轮廓组织成两层层次结构。
- `RETR_TREE`: 检测所有轮廓,并将轮廓组织成树形结构。
- `method`: 表示轮廓逼近方法,有以下三种取值:
- `CHAIN_APPROX_NONE`: 不逼近,保留所有轮廓点。
- `CHAIN_APPROX_SIMPLE`: 简单逼近,仅保留轮廓的端点。
- `CHAIN_APPROX_TC89_L1` 或 `CHAIN_APPROX_TC89_KCOS`: 使用Teh-Chin链逼近算法。
- `offset`: 表示从原始图像到轮廓图像的偏移量。
以下是一个使用findContours函数进行轮廓检测的例子:
```cpp
cv::Mat image = cv::imread("image.png", cv::IMREAD_GRAYSCALE);
cv::threshold(image, image, 128, 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::Mat result;
cv::cvtColor(image, result, cv::COLOR_GRAY2BGR);
cv::drawContours(result, contours, -1, cv::Scalar(0, 0, 255), 2);
cv::imshow("Result", result);
cv::waitKey(0);
```
这个例子将读取一张灰度图像,将其二值化,并使用findContours函数检测最外层轮廓。检测到的轮廓会用红色线条绘制在输出图像上。