opencv c++ 画前二大面积的轮廓
时间: 2024-08-13 21:01:52 浏览: 47
在 OpenCV 中,如果你想要绘制图像中最先出现的两个最大的轮廓,你可以按照以下步骤操作:
1. **读取图像**:首先加载需要处理的图片,可以使用 `cv::imread` 函数。
```cpp
cv::Mat img = cv::imread("your_image.jpg");
```
2. **预处理图像**:对图像进行灰度化、边缘检测等处理,以便后续找到轮廓。例如,可以使用 Canny 边缘检测算法:
```cpp
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::Mat edges;
cv::Canny(gray, edges, 50, 150); // 第一阈值和第二阈值
```
3. **找到轮廓**:通过 `cv::findContours` 函数找出图像中的轮廓,并存储到 vector 中:
```cpp
std::vector<std::vector<cv::Point>> contours;
cv::findContours(edges, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
```
4. **排序轮廓**:计算每个轮廓的面积并按降序排列。这一步需要遍历轮廓并使用 `cv::contourArea` 计算面积,然后利用标准库的 `std::sort`:
```cpp
std::vector<cv::Vec4i> contourInfo(contours.size());
for (size_t i = 0; i < contours.size(); ++i) {
contourInfo[i] = i;
contourInfo[i] = cv::contourArea(contours[i]);
}
std::sort(contourInfo.begin(), contourInfo.end(), [](const cv::Vec4i &a, const cv::Vec4i &b) { return a > b; });
// 取前两个最大的轮廓
int numContoursToKeep = 2;
contours.resize(numContoursToKeep);
std::copy(contourInfo.begin() + contourInfo.size() - numContoursToKeep,
contourInfo.end(),
contourInfo.begin());
```
5. **绘制轮廓**:最后,遍历筛选后的轮廓并用红色描边出来:
```cpp
for (const auto &info : contourInfo) {
cv::drawContours(img, contours, info, cv::Scalar(0, 0, 255), 2); // 红色描边
}
```
6. **显示结果**:
```cpp
cv::imshow("Detected Contours", img);
cv::waitKey();
```
阅读全文