c++如何对opencv绘制出来的轮廓按照从大到小的顺序排序?
时间: 2023-11-03 11:04:10 浏览: 117
可以使用`cv::findContours()`函数来找到轮廓,并将其存储在一个向量中。然后,可以使用`std::sort()`函数对这个向量进行排序,按照每个轮廓的面积从大到小的顺序进行排序。
以下是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
bool compareContourAreas(vector<Point> contour1, vector<Point> contour2) {
double i = fabs(contourArea(Mat(contour1)));
double j = fabs(contourArea(Mat(contour2)));
return (i > j);
}
int main() {
Mat img = imread("path/to/image.jpg");
Mat gray, binary;
cvtColor(img, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 100, 255, THRESH_BINARY);
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
sort(contours.begin(), contours.end(), compareContourAreas);
for (size_t i = 0; i < contours.size(); i++) {
drawContours(img, contours, i, Scalar(0, 0, 255), 2);
}
imshow("Contours", img);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先使用`cv::findContours()`函数找到图像中的所有轮廓,并将它们存储在一个向量中。然后,我们定义了一个`compareContourAreas`函数,该函数用于比较两个轮廓的面积,并返回一个布尔值,以指示哪个轮廓的面积更大。最后,我们使用`std::sort()`函数对轮廓向量进行排序,按照面积从大到小的顺序进行排序。
最后,我们使用`cv::drawContours()`函数将排序后的轮廓绘制在原始图像上。
阅读全文