findContours
时间: 2023-07-18 12:12:15 浏览: 73
`findContours`是一个在OpenCV中用于在二值图像中查找轮廓的函数。轮廓是二值图像中所有连通区域的边界线,可以用于识别图像中的目标物体或图案。
函数原型如下:
```c++
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
其中,各个参数的含义如下:
- `image`:输入二值图像,应该是一个单通道8位图像。
- `contours`:输出轮廓,是一个向量的向量,每个向量表示一个轮廓,其中每个元素都是一个点的坐标。
- `hierarchy`:可选输出轮廓层次结构,用于描述轮廓之间的嵌套关系。默认情况下,将不会输出此参数。
- `mode`:轮廓查找模式,有以下几种模式可选:
- `CV_RETR_EXTERNAL`:只查找最外层轮廓。
- `CV_RETR_LIST`:查找所有轮廓,但不建立父子关系。
- `CV_RETR_CCOMP`:查找所有轮廓,并将其组织成两级层次结构。顶层为各个物体的外层边界,第二层为物体内部的轮廓边界。如果轮廓的内部还有其他轮廓,则其内部的轮廓也组织为两级结构,并与外层轮廓建立父子关系。
- `CV_RETR_TREE`:查找所有轮廓,并将其组织成完整的层次结构。每个轮廓都与其子轮廓和父轮廓相连。
- `method`:轮廓逼近方法,有以下几种方法可选:
- `CV_CHAIN_APPROX_NONE`:存储所有边界点,不进行任何逼近。
- `CV_CHAIN_APPROX_SIMPLE`:只存储水平、垂直和对角线方向上的端点,其他中间点不予保留。
- `CV_CHAIN_APPROX_TC89_L1`:使用Teh-Chin链逼近算法中的L1距离进行逼近。
- `CV_CHAIN_APPROX_TC89_KCOS`:使用Teh-Chin链逼近算法中的cosine距离进行逼近。
- `offset`:可选偏移量,用于指定轮廓点的偏移量。默认情况下,将不会使用此参数。
下面是一个示例代码,演示如何使用`findContours`函数查找输入二值图像中的所有轮廓:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 读取输入图像
cv::Mat image = cv::imread("input.png", cv::IMREAD_GRAYSCALE);
// 将图像二值化
cv::Mat binary;
cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY);
// 查找轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binary, contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
// 输出结果
std::cout << "Contours found: " << contours.size() << std::endl;
return 0;
}
```
在这个示例中,我们首先读取了一个灰度图像,然后将其二值化。接着,我们调用了`findContours`函数,查找输入二值图像中的所有轮廓。最后,我们输出了查找到的轮廓的数量。
阅读全文