for (int i = 0; i < contours.size(); i++) { //先找到每个轮廓的面积 int area = contourArea(contours[i]); //打印出面积 cout << area << endl; if (area > 130 && area < 140 ) { float peri = arcLength(contours[i], true); vector<vector<Point>> conPoly(contours.size()); approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true); vector<Rect> boundRect(contours.size()); //绘制矩形边界框,将含纳每一个独立的形状 boundRect[i] = boundingRect(conPoly[i]); //将边界框打印在原图上 rectangle(img1, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 2); } }解释一下
时间: 2024-04-27 19:20:54 浏览: 11
这段代码是在对轮廓进行处理的过程中,找出满足一定条件的轮廓,并在原图上绘制出该轮廓对应的矩形边框。
具体流程如下:
1. 对于每一个轮廓,先计算其面积。
2. 如果该轮廓的面积在某个特定范围内(这里是130到140之间),则继续处理该轮廓。
3. 计算该轮廓的周长(即边界长度)。
4. 使用多边形逼近算法(`approxPolyDP`函数)对该轮廓进行逼近,得到近似多边形。
5. 创建一个矩形边界框(`Rect`类型),将该轮廓的边界框存储在`boundRect`向量中。
6. 在原图上绘制该轮廓对应的矩形边界框(`rectangle`函数)。
需要注意的是,这段代码中使用了一些向量(`vector`)类型的变量,例如`contours`、`conPoly`和`boundRect`。这些变量的作用是分别存储所有轮廓、多边形逼近后的轮廓和边界框。在处理过程中,这些向量会根据需要动态增长或缩小,以适应不同数量的轮廓。
相关问题
获取所有轮廓的首尾点,轮廓间首尾点的距离都小于阈值,将每两个距离最近的首尾点的轮廓连接起来 double minDist = DBL_MAX; Point2f p1, p2; for (int i = 0; i < Contours_points.size(); i++) { for (int j = i + 1; j < Contours_points.size(); j++) { double dist1 = norm(Contours_points[i].front() - Conto
我了解您的问题。您的代码片段中,您需要获取所有轮廓的首尾点,将每两个距离最近的首尾点的轮廓连接起来。在这里,您可以使用以下代码来获取每个轮廓的首尾点,并计算它们之间的距离:
```cpp
vector<Point2f> start_pts, end_pts;
vector<double> min_dists;
for (int i = 0; i < Contours_points.size(); i++) {
// 获取当前轮廓的首尾点
Point2f start_pt = Contours_points[i].front();
Point2f end_pt = Contours_points[i].back();
start_pts.push_back(start_pt);
end_pts.push_back(end_pt);
// 计算当前轮廓的首尾点与其他轮廓的首尾点之间的距离
for (int j = i + 1; j < Contours_points.size(); j++) {
double dist1 = norm(start_pt - start_pts[j]);
double dist2 = norm(start_pt - end_pts[j]);
double dist3 = norm(end_pt - start_pts[j]);
double dist4 = norm(end_pt - end_pts[j]);
double min_dist = min(min(dist1, dist2), min(dist3, dist4));
min_dists.push_back(min_dist);
}
}
```
然后,您可以使用以下代码来找到距离最近的首尾点,并将它们连接起来:
```cpp
// 找到距离最近的首尾点
double min_dist = DBL_MAX;
int min_start_idx, min_end_idx;
for (int i = 0; i < min_dists.size(); i++) {
if (min_dists[i] < min_dist) {
min_dist = min_dists[i];
min_start_idx = i / (Contours_points.size() - 1);
min_end_idx = i % (Contours_points.size() - 1);
if (min_end_idx >= min_start_idx) min_end_idx++;
}
}
// 将距离最近的首尾点连接起来
vector<Point> merged_contour;
merged_contour.insert(merged_contour.end(), Contours_points[min_start_idx].begin(), Contours_points[min_start_idx].end());
merged_contour.insert(merged_contour.end(), Contours_points[min_end_idx].rbegin(), Contours_points[min_end_idx].rend());
```
请注意,您需要在检查每个轮廓的首尾点之间的距离之前,确保它们之间的距离小于阈值。
//轮廓发现与绘制 vector<vector<Point>> contours; vector<Vec4i> hierarchy; Vec4f line0, line1, line2, line3, line4, line5, line6, line7, line8, line9, line10, line11, line12, line13, line14, line15, line16, line17, line18, line19; findContours(edge, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); //绘制轮廓 for (int t = 0; t < hierarchy.size(); t++) { drawContours(edge, contours, t, Scalar(255, 255, 255), 1, 4); //printf("%d", t); } int m0, n0; for (m0 = 0; m0 < contours.size(); m0++) { for (n0 = 0; n0 < contours[m0].size(); n0++) cout << contours[m0][n0] << ""; cout << "\n"; }
这段代码是用于轮廓发现与绘制的。首先,调用`findContours()`函数对二值化图像`edge`进行轮廓发现,得到所有轮廓的坐标信息存储在`contours`向量中,同时每个轮廓的层级信息存储在`hierarchy`中。接着,使用`drawContours()`函数对每个轮廓进行绘制,这里使用白色线条绘制。最后,通过两层循环遍历`contours`向量中的每个轮廓,输出其中所有点的坐标信息。