opencv c++ 矩形拟合
时间: 2025-02-09 15:11:09 浏览: 75
在 OpenCV C++ 中,矩形拟合通常用于图像处理任务中检测并描绘物体轮廓的最小外接矩形。这可以分为两种情况:
1. **直立矩形(非旋转)**:即与坐标轴平行的矩形。
2. **旋转矩形**:能够适应倾斜角度的最佳包裹矩形。
### 直立矩形拟合
对于不需要考虑旋转的情况,你可以简单地通过 `boundingRect` 函数获得一个包含所有点集或特定轮廓的最小外包矩形,并且该函数返回的是一个标准的、边框水平垂直于x-y坐标的矩形区域信息 (如左上角位置以及宽高)。下面是一段示例代码展示如何应用这个功能:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
// ... 加载图片等操作 ...
std::vector<std::vector<Point>> contours;
findContours(image, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for(const auto& contour : contours){
Rect bounding_box = boundingRect(contour);
// 绘制包围盒到原图上去
rectangle(image, bounding_box.tl(), bounding_box.br(), Scalar(0, 255, 0), 2);
}
```
### 旋转矩形拟合
如果你需要更精确地描述轮廓,则应使用 `minAreaRect()` 来得到一个RotatedRect对象,它可以表示任意方向上的最小面积矩形。然后我们可以利用其成员变量绘制出实际图形:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
// ...
std::vector<std::vector<Point>> contours;
findContours(src_gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for(const auto &cnt : contours)
{
RotatedRect min_rect = minAreaRect(cnt);
Point2f rect_points[4];
min_rect.points(rect_points);
for(int j = 0; j < 4; ++j)
line(image, rect_points[j], rect_points[(j+1)%4], Scalar(0,255,0), 2);
}
imshow("Result", image);
waitKey();
```
这两种方法可以根据你的需求选择合适的方式来进行矩形拟合,在许多应用场景下都非常有用!
阅读全文
相关推荐


















