``` std::vector<std::vector<cv::Point>> contours; cv::findContours(binary, contours, cv::RETR_LIST, cv::CHAIN_APPROX_NONE); ```
时间: 2024-11-17 14:28:06 浏览: 25
```cpp
// 初始化一个二维动态向量contours,用来存放轮廓信息,每个内部元素也是一个包含cv::Point的向量
std::vector<std::vector<cv::Point>> contours;
// 调用OpenCV的findContours函数对二值化图像binary进行轮廓检测
// 参数:
// - binary:输入的二值化图像
// - contours:输出的结果轮廓列表,即前面初始化的contours变量
// - RETR_LIST:轮廓检索模式,表示返回所有可以追踪到的轮廓点,不关心它们之间的连接关系
// - CHAIN_APPROX_NONE:轮廓近似方法,表示不压缩轮廓上的顶点,保留原始形状
cv::findContours(binary, contours, cv::RETR_LIST, cv::CHAIN_APPROX_NONE);
```
这部分代码的作用是对给定的二值化图像(binary)进行轮廓检测,将检测出的所有轮廓信息存储在一个二维向量`contours`中。`cv::RETR_LIST`表示寻找所有的轮廓点,`cv::CHAIN_APPROX_NONE`表示在计算轮廓时保持原点精度,不进行任何简化。这样,每个轮廓都是由一系列的点构成,可用于后续分析如形状识别、物体分割等。
相关问题
cv::findContours输出
cv::findContours函数的输出参数是一个包含所有轮廓的向量(vector),每个轮廓都表示为一个点集。这个输出参数通常是一个名为`contours`的变量,可以是一个向量的向量(`std::vector<std::vector<cv::Point>> contours`)或者一个简单的向量(`std::vector<cv::Point> contours`)。
如果使用向量的向量来存储轮廓,那么每个内部向量表示一个单独的轮廓。每个轮廓由一系列点组成,每个点都表示为`cv::Point`类型。如果使用简单的向量来存储轮廓,那么所有的轮廓点都被连续存储在同一个向量中。
以下是一个示例代码片段,演示如何使用cv::findContours函数并输出轮廓:
```cpp
cv::Mat image; // 输入图像
cv::Mat binaryImage; // 二值化后的图像
std::vector<std::vector<cv::Point>> contours; // 存储轮廓的向量
// 对输入图像进行二值化处理,将结果保存在binaryImage中
cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);
// 查找二值化图像中的轮廓
cv::findContours(binaryImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 输出轮廓的数量
std::cout << "Number of contours: " << contours.size() << std::endl;
// 遍历所有轮廓
for (size_t i = 0; i < contours.size(); i++) {
// 输出每个轮廓的点数
std::cout << "Contour " << i << " size: " << contours[i].size() << std::endl;
}
```
上述代码首先对输入图像进行二值化处理,然后使用cv::findContours函数查找轮廓,并将结果存储在contours向量中。最后,打印出轮廓的数量和每个轮廓的点数。
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE) 中,使用一个矩形框框住contours中的所有轮廓
如果您想要使用一个矩形框住contours中的所有轮廓,可以使用`cv::boundingRect`函数来计算所有轮廓的整体边界矩形。以下是一个示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// 读取图像
cv::Mat image = cv::imread("image.jpg");
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// 二值化图像
cv::Mat binary;
cv::threshold(gray, binary, 128, 255, cv::THRESH_BINARY);
// 寻找轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 计算所有轮廓的整体边界矩形
cv::Rect boundingRect;
for (const auto& contour : contours)
{
// 扩展整体边界矩形
boundingRect |= cv::boundingRect(contour);
}
// 在原始图像上绘制整体边界矩形
cv::rectangle(image, boundingRect, cv::Scalar(0, 255, 0), 2);
// 显示结果
cv::imshow("Bounding Rect", image);
cv::waitKey(0);
return 0;
}
```
在这个示例中,我们首先找到所有的轮廓,然后遍历每一个轮廓,使用`cv::boundingRect`函数计算每个轮廓的边界矩形,并通过扩展整体边界矩形的方式获得所有轮廓的整体边界矩形。最后,我们在原始图像上绘制整体边界矩形。
同样,请确保将代码中的"image.jpg"替换为您自己的图像路径,并正确安装和配置OpenCV库。
阅读全文