opencv c++ findContours
时间: 2024-12-26 20:17:21 浏览: 2
### 如何在C++中使用OpenCV的`findContours`函数
#### 函数原型
为了理解如何使用 `cv::findContours()` 函数,在 C++ 中该函数用于检测图像中的轮廓。此功能对于二值图像是最有效的,因此通常会在阈值处理之后调用它。
```cpp
void cv::findContours(
InputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point()
);
```
参数解释如下:
- **InputArray image**: 输入图像应该是8位单通道(灰度)图像[^1]。
- **OutputArrayOfArrays contours**: 输出向量,每个轮廓都是由点组成的向量。
- **OutputArray hierarchy**: 可选输出向量,包含有关图像拓扑结构的信息。
- **int mode**: 轮廓检索模式,定义了返回哪些轮廓以及它们之间的关系。
- **int method**: 轮廓近似方法。
- **Point offset**: 可选偏移量,应用于所有轮廓点。
#### 使用示例
下面是一个简单的例子来展示如何应用这个函数:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
// 加载原始图片并转换成灰度格式
Mat src = imread("your_image_path", IMREAD_COLOR); // 确保路径正确
cvtColor(src, srcGray, COLOR_BGR2GRAY);
// 应用边缘检测算法获取二值化图像
threshold(srcGray, binaryImage, 127, 255, THRESH_BINARY);
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
/// 查找轮廓
findContours(binaryImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
/// 绘制轮廓到原图上
drawContours(src, contours, -1, Scalar(0, 255, 0), 2, LINE_8, hierarchy);
imshow("Detected Contours", src);
waitKey();
```
这段代码首先读取了一张彩色图片,并将其转化为灰度形式;接着通过设定合适的阈值得到了一张黑白两色的二值图像;最后利用 `findContours` 方法提取出了所有的轮廓并将这些轮廓绘制回原来的颜色空间内显示出来。
阅读全文