cv::findContours参数详解及可选参数
时间: 2023-09-03 21:06:38 浏览: 114
cv::findContours是OpenCV中用于查找图像轮廓的函数。它的参数如下:
1. 输入图像:需要查找轮廓的图像。
2. 轮廓:包含所有轮廓的向量。
3. 层次结构:可选参数,提供轮廓之间的关系。
4. 查找轮廓的模式:可选参数,指定轮廓的查找模式。
5. 轮廓近似方法:可选参数,指定轮廓的近似方法。
6. 偏移量:可选参数,指定轮廓点的偏移量。
其中,最常用的是前两个参数,即输入图像和轮廓向量。下面是可选参数的详细解释:
1. 层次结构:指定轮廓之间的关系,例如轮廓的父子关系。默认为NULL,表示所有轮廓都是同一级别的。
2. 查找轮廓的模式:有两种模式,分别为RETR_EXTERNAL和RETR_LIST。
- RETR_EXTERNAL:只检测最外层轮廓,所有的子轮廓都被忽略。
- RETR_LIST:检测所有的轮廓,但是不建立轮廓之间的等级关系。
3. 轮廓近似方法:有三种方法,分别为CHAIN_APPROX_NONE、CHAIN_APPROX_SIMPLE和CHAIN_APPROX_TC89_L1。
- CHAIN_APPROX_NONE:保存所有的轮廓点,不进行任何压缩。
- CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向的轮廓,只保留端点。
- CHAIN_APPROX_TC89_L1:应用Teelon- Chinl算法进行轮廓近似。
4. 偏移量:指定轮廓点的偏移量。默认为(0,0),表示不进行偏移。
以上就是cv::findContours函数的参数详解及可选参数。
相关问题
javacv的findContours方法参数解析
`findContours`是JavaCV中用于查找轮廓的方法,其参数解析如下:
```java
public static void findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method, Point offset)
```
- `image`:输入图像,必须是8位单通道图像。
- `contours`:输出参数,检测到的轮廓。
- `hierarchy`:可选的输出参数,轮廓的层次结构信息。
- `mode`:轮廓检索模式。
- `RETR_EXTERNAL`:只检索最外层的轮廓。
- `RETR_LIST`:检索所有轮廓,但不建立父子关系。
- `RETR_TREE`:检索所有轮廓,并建立完整的层次结构。
- `method`:轮廓逼近方法。
- `CHAIN_APPROX_NONE`:存储所有的轮廓点。
- `CHAIN_APPROX_SIMPLE`:压缩水平、垂直和对角线方向上的冗余点,仅保留端点。
- `CHAIN_APPROX_TC89_L1`:使用Teh-Chin链逼近算法的一种变体,L1距离度量。
- `CHAIN_APPROX_TC89_KCOS`:使用Teh-Chin链逼近算法的一种变体,余弦距离度量。
- `offset`:可选的偏移量,用于指定轮廓点的偏移量。
其中`hierarchy`参数用于存储轮廓的层次结构信息,它是一个`Nx4`的矩阵,每行对应一个轮廓的信息,包含四个整数值,分别是:
- `hierarchy[i][0]`:后一个轮廓的索引,如果没有后一个轮廓,则为-1。
- `hierarchy[i][1]`:前一个轮廓的索引,如果没有前一个轮廓,则为-1。
- `hierarchy[i][2]`:子轮廓的索引,如果没有子轮廓,则为-1。
- `hierarchy[i][3]`:父轮廓的索引,如果没有父轮廓,则为-1。
对于不同的模式和方法,`findContours`方法会返回不同的轮廓点集,但是它们都是`MatOfPoint`类型的对象,可以通过`contours.get(i)`获取第i个轮廓的点集。
cv2.findcontours算法详解
cv2.findContours是OpenCV中用于查找图像中轮廓的函数,常用于图像处理、图像分割等领域。该函数的返回结果是一个轮廓列表,每个轮廓由一系列点坐标组成。
函数定义:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
参数说明:
- image:输入图像,必须为二值图像(通常为灰度图像或二值化后的图像)。
- mode:轮廓查找模式,有以下三种模式可选:
- cv2.RETR_EXTERNAL:只检测最外层轮廓。
- cv2.RETR_LIST:检测所有轮廓,不建立轮廓层级关系。
- cv2.RETR_TREE:检测所有轮廓,建立完整的轮廓层级关系。
- method:轮廓查找方法,有以下三种方法可选:
- cv2.CHAIN_APPROX_NONE:存储所有边界点。
- cv2.CHAIN_APPROX_SIMPLE:仅存储水平、垂直和对角线的端点。
- cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chin算法进行边缘提取。
- contours:输出参数,存储轮廓信息。如果不需要可省略。
- hierarchy:输出参数,存储轮廓层级关系信息。如果不需要可省略。
- offset:可选参数,偏移量。如果不需要可省略。
轮廓查找流程:
1. 二值化输入图像。
2. 对二值图像进行边缘提取,得到边缘图像。
3. 对边缘图像进行轮廓查找,得到轮廓列表。
轮廓存储格式:
OpenCV中轮廓的存储格式为numpy数组,每个轮廓由一系列点坐标组成。例如,一个具有三个轮廓的图像,其轮廓存储格式为:
contours = [array([[[10,10],[10,20],[20,20],[20,10]]], dtype=int32),
array([[[40,40],[40,50],[50,50],[50,40]]], dtype=int32),
array([[[70,70],[70,80],[80,80],[80,70]]], dtype=int32)]
其中,每个轮廓由一个二维数组表示,数组中的每个元素为一个点坐标,坐标的数据类型为int32。
轮廓层级关系:
在cv2.RETR_TREE模式下,轮廓查找函数会返回轮廓列表和轮廓层级关系列表。轮廓层级关系列表存储了轮廓之间的父子关系,可以用于分析轮廓之间的层级结构。
例如,一个具有以下轮廓层级结构的图像:
轮廓列表和轮廓层级关系列表的存储格式为:
contours = [array([[[0,0],[0,100],[100,100],[100,0]]], dtype=int32),
array([[[10,10],[10,90],[90,90],[90,10]]], dtype=int32),
array([[[20,20],[20,80],[80,80],[80,20]]], dtype=int32),
array([[[30,30],[30,70],[70,70],[70,30]]], dtype=int32),
array([[[40,40],[40,60],[60,60],[60,40]]], dtype=int32),
array([[[50,50],[50,50],[50,50],[50,50]]], dtype=int32)]
hierarchy = [[-1,-1,-1,-1],
[ 0,-1,-1,-1],
[ 1,-1,-1,-1],
[ 2,-1,-1,-1],
[ 3,-1,-1,-1],
[-1, 4,-1,-1]]
其中,hierarchy的每一行对应一个轮廓,包含四个元素。第一个元素表示当前轮廓的下一个轮廓,如果没有则为-1。第二个元素表示当前轮廓的前一个轮廓,如果没有则为-1。第三个元素表示当前轮廓的第一个子轮廓,如果没有则为-1。第四个元素表示当前轮廓的父轮廓,如果没有则为-1。
阅读全文