opencv的c++的findContours
时间: 2023-11-30 10:50:10 浏览: 79
Python通过OpenCV的findContours获取轮廓并切割实例
5星 · 资源好评率100%
您好!关于OpenCV C++中的findContours函数,它用于在图像中查找轮廓。
函数原型如下:
```
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`和`CV_CHAIN_APPROX_TC89_KCOS`:使用Telesco-Kanade算法进行轮廓近似。
- offset:可选参数,表示轮廓点的偏移量。
使用示例:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("image.jpg", 0); // 以灰度图像读取图片
if (image.empty())
{
return -1;
}
// 二值化处理
Mat thresholded;
threshold(image, thresholded, 128, 255, THRESH_BINARY);
// 寻找轮廓
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(thresholded, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
Mat result = Mat::zeros(image.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++)
{
Scalar color = Scalar(0, 0, 255); // 蓝色
drawContours(result, contours, i, color, 2, LINE_8, hierarchy);
}
imshow("Contours", result);
waitKey(0);
return 0;
}
```
这是一个简单的示例,它加载一张图片,对其进行二值化处理,然后找到并绘制轮廓。请根据您的实际需求适当调整代码。
希望能对您有所帮助!如果还有其他问题,请随时提问。
阅读全文