findContours的使用方法和返回值
时间: 2023-08-09 07:05:02 浏览: 121
`cv::findContours()` 函数是 OpenCV 中用于查找图像中轮廓的函数,其函数原型如下:
```c++
void cv::findContours(
InputOutputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point())
```
参数说明:
- `image`:输入图像,需要是二值图像(黑白图像),并且是 8 位单通道图像。
- `contours`:输出的轮廓,是一个二维向量(vector),每个元素都是一个包含所有轮廓点的向量(vector)。
- `hierarchy`:可选的输出向量,包含了轮廓的层次结构信息,其大小和轮廓向量大小相同。
- `mode`:轮廓查找模式,有四种模式可选,分别是 `RETR_EXTERNAL`、`RETR_LIST`、`RETR_CCOMP` 和 `RETR_TREE`,具体可参考 OpenCV 文档。
- `method`:轮廓逼近方法,有三种方法可选,分别是 `CHAIN_APPROX_NONE`、`CHAIN_APPROX_SIMPLE` 和 `CHAIN_APPROX_TC89_L1`,具体可参考 OpenCV 文档。
- `offset`:可选的偏移量,用于指定轮廓的偏移量,默认值为 `Point()`。
函数返回值:无返回值,但是会修改 `contours` 和 `hierarchy` 的值。
以下是一个示例代码,用于演示如何使用 `cv::findContours()` 函数:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("binary_image.png", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image" << endl;
return 1;
}
// 找到轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
Mat contourImg(img.size(), CV_8UC3, Scalar(0, 0, 0));
for (int i = 0; i < contours.size(); i++)
{
Scalar color(rand() & 255, rand() & 255, rand() & 255);
drawContours(contourImg, contours, i, color, 2);
}
namedWindow("Contours", WINDOW_NORMAL);
imshow("Contours", contourImg);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取了一个二值图像。然后,我们使用 `cv::findContours()` 函数找到图像中的轮廓,将轮廓存储在 `contours` 中,将层次结构信息存储在 `hierarchy` 中。接下来,我们使用 `cv::drawContours()` 函数在一个黑色图像上绘制轮廓,使用随机颜色。最后,我们显示了绘制轮廓后的图像。
需要注意的是,这个示例代码中使用了随机颜色绘制轮廓,如果你想使用固定颜色,可以将 `Scalar` 替换为你需要的颜色。
阅读全文