opencv c++中findContours的语法
时间: 2023-08-04 16:32:58 浏览: 85
findContours函数的语法如下:
```
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
函数参数说明:
- `image`:输入图像,必须为8位单通道二值图像,非零像素表示轮廓,0像素表示背景。
- `contours`:输出参数,用于存储检测到的轮廓,每个轮廓都表示为一组点的向量。
- `hierarchy`:输出参数,用于存储轮廓之间的关系,可选参数。
- `mode`:轮廓检索模式,可选值包括`RETR_EXTERNAL`(只检测最外层轮廓)、`RETR_LIST`(检测所有轮廓,但不建立轮廓的层次结构)、`RETR_CCOMP`(检测所有轮廓,并将轮廓分为两级层次结构,顶层为物体的外部边界,次层为物体内部的空洞边界)、`RETR_TREE`(检测所有轮廓,并重建轮廓的完整层次结构)。
- `method`:轮廓逼近方法,可选值包括`CHAIN_APPROX_NONE`(保存所有的轮廓点)、`CHAIN_APPROX_SIMPLE`(压缩水平、垂直和对角线方向上的冗余点,仅保留轮廓的端点)、`CHAIN_APPROX_TC89_L1`、`CHAIN_APPROX_TC89_KCOS`(使用Teh-Chinl链逼近算法中的一个)。
- `offset`:可选参数,偏移量。
函数返回值为void类型,表示没有返回值。
相关问题
opencv c++中findcontours语法
在OpenCV C++中,`findContours`函数的语法如下:
```c++
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
其中,参数含义如下:
- `image`:输入的二值图像,通常为经过边缘检测后得到的图像。
- `contours`:输出的轮廓,为一个`vector<vector<Point> >`类型的数组,其中每个元素表示一个轮廓,包含一系列点的坐标。
- `hierarchy`:输出的轮廓的层级关系,为一个`vector<Vec4i>`类型的数组,其中每个元素包含四个整数,分别表示当前轮廓的父轮廓、子轮廓、内嵌轮廓和外层轮廓的索引。
- `mode`:轮廓检索模式,可以取以下值:
- `RETR_EXTERNAL`:只检索最外层的轮廓。
- `RETR_LIST`:检索所有轮廓,但不建立轮廓间的层级关系。
- `RETR_CCOMP`:检索所有轮廓,并将轮廓分为两层:顶层为各部分的外部边界,次层为空洞的边界。
- `RETR_TREE`:检索所有轮廓,并重构嵌套轮廓的完整层级关系。
- `method`:轮廓逼近方法,可以取以下值:
- `CHAIN_APPROX_NONE`:保存物体边界上所有连续的轮廓点到contours向量内。
- `CHAIN_APPROX_SIMPLE`:压缩水平、垂直和对角线方向上的像素,仅保留终点坐标。
- `CHAIN_APPROX_TC89_L1`:使用Teh-Chin链逼近算法中的L1距离。
- `CHAIN_APPROX_TC89_KCOS`:使用Teh-Chin链逼近算法中的Kcos距离。
- `offset`:可选的偏移量,用于指定轮廓点坐标的偏移值。
例如,在检测最外层轮廓并使用简单的轮廓逼近方法时,可以这样调用`findContours`函数:
```c++
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_canny;
Canny(img, img_canny, 100, 200);
vector<vector<Point>> contours;
findContours(img_canny, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
```
这将读入名为`test.jpg`的灰度图像,对其进行Canny边缘检测,并在其中寻找最外层轮廓,使用简单的轮廓逼近方法。最终,找到的轮廓将存储在`contours`向量内。
Opencv的drawContours函数在c++中如何使用
在C++中使用OpenCV的`drawContours`函数可以绘制轮廓。该函数的语法如下:
```cpp
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = LINE_8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point())
```
参数解释:
- `image`:输入输出图像,即要在其上绘制轮廓的图像。
- `contours`:轮廓点序列的向量,每个向量存储一个轮廓。多个轮廓存储在一个向量中。
- `contourIdx`:要绘制的轮廓的索引,若为负数则绘制所有轮廓。
- `color`:轮廓线条的颜色。
- `thickness`:轮廓线条的宽度,默认值为1。
- `lineType`:线条类型,可以是`LINE_8`或`LINE_4`。
- `hierarchy`:可选的输入向量,存储轮廓的层次结构信息。
- `maxLevel`:绘制轮廓的最大层级。
- `offset`:偏移量,即从轮廓到图像的偏移量。
示例代码:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg");
cvtColor(img, img, COLOR_BGR2GRAY);
threshold(img, img, 100, 255, THRESH_BINARY_INV);
std::vector<std::vector<Point>> contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
Mat dst = Mat::zeros(img.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++)
{
Scalar color = Scalar(rand() % 256, rand() % 256, rand() % 256);
drawContours(dst, contours, i, color, 2);
}
imshow("contours", dst);
waitKey(0);
return 0;
}
```
以上代码加载一张图片,将其转换为灰度图并二值化。然后使用`findContours`函数获取轮廓点的向量,最后使用`drawContours`函数绘制轮廓线条。在绘制时可以设置每个轮廓的颜色和宽度。
阅读全文