计算多边形的最小包络矩形

计算多边形的最小包络矩形

在OpenCV中,可以使用minAreaRect函数来计算一个点集或多边形的最小包络矩形(旋转的矩形)。以下是一个C++的示例,它创建一个多边形,然后计算并绘制最小包络矩形:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <opencv2/opencv.hpp>
#include <vector>

int main()
{
// 创建一个空白图像
cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

// 创建一个多边形的点集(例如,一个三角形)
std::vector<cv::Point2f> points;
points.push_back(cv::Point2f(100, 100));
points.push_back(cv::Point2f(200, 100));
points.push_back(cv::Point2f(150, 200));

// 计算最小包络矩形
cv::RotatedRect minRect = cv::minAreaRect(points);

// 获得包络矩形的四个角点
cv::Point2f rect_points[4];
minRect.points(rect_points);

// 绘制多边形和最小包络矩形
for (int i = 0; i < 3; i++)
cv::line(img, points[i], points[(i+1)%3], cv::Scalar(255, 0, 0), 2, 8);

for (int i = 0; i < 4; i++)
cv::line(img, rect_points[i], rect_points[(i+1)%4], cv::Scalar(0, 255, 0), 2, 8);

// 显示图像
cv::imshow("Image", img);
cv::waitKey(0);

return 0;
}


在这个示例中,我们首先创建了一个空白的图像和一个三角形的点集。然后,我们使用minAreaRect函数计算这个点集的最小包络矩形。minAreaRect函数返回一个RotatedRect对象,我们可以使用points方法获取这个矩形的四个角点。然后,我们在图像上绘制出这个多边形和最小包络矩形,最后显示这个图像。

获得最小包络矩形的长度和宽度

RotatedRect 对象的 size 成员包含了最小包络矩形的长度和宽度。你可以这样获取

1
2
3
4
5
6
7
8
9
10
// 计算最小包络矩形
cv::RotatedRect minRect = cv::minAreaRect(points);

// 获取矩形的大小(长度和宽度)
cv::Size2f rectSize = minRect.size;

// 输出长度和宽度
std::cout << "Width: " << rectSize.width << std::endl;
std::cout << "Height: " << rectSize.height << std::endl;


注意,OpenCV中的 RotatedRect 结构其实是包含旋转的矩形,也就是说,它的 “宽度” 和 “高度” 并不直接等于我们通常意义上的 “宽度” 和 “高度”。事实上,它们是矩形的两个边的长度,这两个边是垂直的。而哪个边是 “宽度”,哪个边是 “高度”,则取决于这个矩形的旋转角度。


计算多边形的最小包络矩形
https://qiangsun89.github.io/2023/06/09/计算多边形的最小包络矩形/
作者
Qiang Sun
发布于
2023年6月9日
许可协议