OpenCV中findcontours函数hierarchy
时间: 2023-10-08 11:06:44 浏览: 106
在OpenCV中,findContours函数的第三个参数hierarchy是一个可选的输出向量,用于指示轮廓之间的关系。hierarchy向量的每个元素是一个长度为4的整型数组,它包含了当前轮廓的下一级轮廓、前一级轮廓、父轮廓和内嵌轮廓的索引。具体来说,hierarchy向量的第i个元素hierarchy[i]的含义如下:
- hierarchy[i][0]:下一级轮廓的索引,如果没有下一级轮廓则为-1;
- hierarchy[i][1]:前一级轮廓的索引,如果没有前一级轮廓则为-1;
- hierarchy[i][2]:父轮廓的索引,如果没有父轮廓则为-1;
- hierarchy[i][3]:内嵌轮廓的索引,如果当前轮廓不是内嵌轮廓则为-1。
可以利用hierarchy向量来实现一些高级的轮廓操作,例如找到所有的轮廓、找到所有的子轮廓、找到所有的边缘轮廓等等。需要注意的是,使用hierarchy向量会增加计算的复杂度,因此如果不需要这些信息,可以将hierarchy参数设置为NULL。
相关问题
C++opencv中findContours函数用法
在C++的OpenCV中,findContours函数用于查找图像中的轮廓。其函数原型如下:
```cpp
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
其中,
- InputOutputArray image:输入图像,必须为8位单通道二进制图像。
- OutputArrayOfArrays contours:输出轮廓,为一个向量类型,包含所有检测到的轮廓。
- OutputArray hierarchy:轮廓的层次结构,可不传入该参数。
- int mode:轮廓检索模式,可取值为RETR_EXTERNAL、RETR_LIST、RETR_CCOMP和RETR_TREE。
- int method:轮廓逼近方法,可取值为CHAIN_APPROX_NONE、CHAIN_APPROX_SIMPLE、CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS。
- Point offset:轮廓点的可选偏移量。
例如,下面的代码使用findContours函数查找图像中的轮廓并在图像中绘制出来:
```cpp
Mat image = imread("example.jpg", IMREAD_GRAYSCALE);
Mat binary;
threshold(image, binary, 100, 255, THRESH_BINARY);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
Mat result = Mat::zeros(image.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++) {
drawContours(result, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy);
}
imshow("result", result);
```
其中,先使用threshold函数将图像二值化,然后使用findContours函数查找轮廓,并使用drawContours函数将轮廓绘制在新的图像上,最后显示结果图像。
中文 opencv findContours 函数
findContours 函数是 OpenCV 中的一个轮廓检测函数,用于在二值化图像中查找轮廓。该函数的语法如下:
```
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
```
参数说明:
- image:输入图像,必须是一个二值化图像(即只有黑白两种颜色)。
- mode:轮廓检索模式,有以下两种模式:
- cv2.RETR_EXTERNAL:只检测外轮廓。
- cv2.RETR_LIST:检测所有轮廓,并将它们保存在列表中。
- method:轮廓逼近方法,有以下几种方法:
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
- cv2.CHAIN_APPROX_SIMPLE:仅存储水平、垂直和对角线方向的端点。
- cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:使用 Teh-Chinl 链逼近算法。
- contours(可选):检测到的轮廓,以列表形式返回。
- hierarchy(可选):轮廓层次结构,以 numpy 数组形式返回。
- offset(可选):轮廓点的偏移量。
返回值:
- contours:检测到的轮廓,以列表形式返回。
- hierarchy:轮廓层次结构,以 numpy 数组形式返回。
示例代码:
```python
import cv2
# 读入图像并转为灰度图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化图像
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
该示例代码将读入一张名为 test.jpg 的图像,并进行灰度化和二值化处理。然后使用 findContours 函数查找轮廓,并使用 drawContours 函数将轮廓绘制在原图上。最后显示结果图像。
阅读全文