qt OpenCV RETR_CCOMP 取顶层
时间: 2023-07-13 08:04:38 浏览: 152
在使用OpenCV的`findContours`函数时,`RETR_CCOMP`模式会将轮廓分成两级:顶层轮廓和次级轮廓。顶层轮廓包围整个物体,而次级轮廓位于物体内部的空洞或孔中。
如果你只想获取顶层轮廓,可以使用以下代码:
```c++
// 定义 contours 和 hierarchy 变量
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
// 执行 findContours 函数
findContours(image, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
// 只保留顶层轮廓
for (int i = 0; i < contours.size(); i++) {
if (hierarchy[i][3] == -1) {
// 这是一个顶层轮廓,进行处理
// ...
}
}
```
在上述代码中,我们首先定义了`contours`和`hierarchy`变量,然后执行了`findContours`函数,将结果保存到这两个变量中。接着,我们遍历每一个轮廓,判断它是否为顶层轮廓。如果是顶层轮廓,我们就可以进行相应的处理。
相关问题
qt OpenCV RETR_CCOMP 取底层
在使用 OpenCV 的 RETR_CCOMP 模式时,您可以使用函数 cv::findContours() 来查找轮廓并获取每个轮廓的层次结构信息。该函数的第三个参数 hierarchy 是一个向量,它存储了每个轮廓的层次结构信息。每个元素都是一个四元组,其中包括轮廓的父轮廓、子轮廓、第一个内嵌轮廓以及下一个同级轮廓的索引。
下面是一个示例代码,演示如何使用 RETR_CCOMP 模式和 findContours() 函数来获取轮廓的底层信息:
```
// 读取图像
cv::Mat image = cv::imread("image.jpg");
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// 二值化
cv::Mat binary;
cv::threshold(gray, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
// 查找轮廓
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(binary, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
// 遍历每个轮廓
for (int i = 0; i < contours.size(); i++) {
// 如果该轮廓没有父轮廓,说明它是最外层的轮廓
if (hierarchy[i][3] == -1) {
// 处理底层轮廓
// ...
}
}
```
在上面的代码中,我们首先读取一张图像,并将其转换为灰度图像和二值图像。然后,我们使用 findContours() 函数查找轮廓,并将轮廓存储在 contours 向量中,层次结构信息存储在 hierarchy 向量中。最后,我们遍历每个轮廓,如果该轮廓没有父轮廓,说明它是最外层的轮廓,我们可以将其视为底层轮廓进行处理。
qt OpenCV RETR_CCOMP 怎么取底层
使用 OpenCV 中的函数 findContours() 可以检测图像中的轮廓。当指定参数 mode 为 RETR_CCOMP 时,findContours() 函数将检测所有轮廓,并将它们分为两层。其中,外部轮廓存储在一级层级中,内部轮廓存储在二级层级中。
要访问 RETR_CCOMP 模式下的轮廓层级信息,可以使用 contourIdx 参数。这个参数是一个整数,用于指定轮廓在层级关系中的索引。如果该轮廓没有儿子轮廓,则 contourIdx 等于 -1。
下面是一个示例代码,展示了如何使用 RETR_CCOMP 模式获取轮廓层级信息:
```cpp
Mat image = imread("test.jpg", IMREAD_GRAYSCALE);
// 获取轮廓信息
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(image, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
// 访问轮廓层级信息
for(int i = 0; i < contours.size(); i++)
{
// 访问第一级轮廓
if(hierarchy[i][3] == -1)
{
// 处理外部轮廓
}
else
{
// 处理内部轮廓
}
}
```
在上面的示例代码中,我们使用 findContours() 函数获取了轮廓信息,并将它们存储在 vectors 中。然后,我们使用 hierarchy 向量访问轮廓层级信息。如果 hierarchy[i][3] 的值为 -1,则表示当前轮廓没有父轮廓,即它是一级轮廓,否则它是二级轮廓。
通过这种方式,我们可以轻松地访问 RETR_CCOMP 模式下的轮廓层级信息,并对它们进行相应的处理。
阅读全文