findContours c++实例
时间: 2024-07-04 21:01:07 浏览: 106
`findContours` 是 OpenCV(开源计算机视觉库)中的一个重要函数,用于从二值图像中检测和提取轮廓。在 C++ 中,`findContours` 函数帮助我们识别出图像中的边缘并将其转换为可操作的对象,如轮廓点列表或轮廓矩。
以下是一个简单的 C++ 示例,展示了如何使用 `findContours` 函数:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main() {
// 读取二值图像
cv::Mat src = cv::imread("binary_image.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat thresholded;
cv::threshold(src, thresholded, 127, 255, cv::THRESH_BINARY); // 二值化处理
// 寻找轮廓
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(thresholded, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
// 处理轮廓(例如,绘制轮廓)
for (size_t i = 0; i < contours.size(); ++i) {
cv::drawContours(src, contours, i, cv::Scalar(0, 0, 255), 2); // 绘制轮廓,红色
}
// 显示结果
cv::imshow("Contours", src);
cv::waitKey(0);
return 0;
}
```
在这个例子中:
- `imread` 用于加载图像
- `threshold` 对图像进行二值化处理,以便后续识别边缘
- `findContours` 传入二值图像、轮廓存储容器、轮廓层次结构、轮廓检索模式(这里为树形结构)和轮廓逼近方法(简单连接)
- 循环遍历找到的轮廓,并使用 `drawContours` 在原图上绘制它们
- 最后,使用 `imshow` 显示包含轮廓的结果
相关问题:
1. `findContours` 的参数含义是什么?
2. 如何根据 `hierarchy` 参数理解轮廓之间的关系?
3. 除了 `CHAIN_APPROX_SIMPLE`,还有哪些轮廓逼近方法?
阅读全文