使用opencv如何获取一个形状的最大内接矩形?用C++回复
时间: 2023-08-09 16:04:44 浏览: 531
在 OpenCV 中,可以使用 `minAreaRect()` 函数获取最小外接矩形,然后根据最小外接矩形的角度信息和长宽比等信息计算出最大内接矩形。
以下是获取最大内接矩形的示例代码:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
// 获取最大内接矩形
RotatedRect getMaxInnerRect(const RotatedRect& rect)
{
float w = rect.size.width;
float h = rect.size.height;
float angle = rect.angle;
if (w < h)
{
std::swap(w, h);
angle += 90.0f;
}
float x = rect.center.x;
float y = rect.center.y;
float theta = angle * CV_PI / 180.0f;
float c = cos(theta);
float s = sin(theta);
float dw = h / (1 + (c / s) * (h / w));
float dh = dw * h / w;
float rx = x + s * dh / 2.0f;
float ry = y - c * dh / 2.0f;
Size2f size(dw, dh);
RotatedRect innerRect(Point2f(rx, ry), size, angle);
return innerRect;
}
int main()
{
Mat image = imread("test.jpg");
// 检测轮廓并获取最小外接矩形
Mat gray, binary;
cvtColor(image, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
std::vector<std::vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
RotatedRect rect = minAreaRect(contours[0]);
// 获取最大内接矩形
RotatedRect innerRect = getMaxInnerRect(rect);
// 绘制最大内接矩形和最小外接矩形
Point2f vertices[4];
rect.points(vertices);
for (int i = 0; i < 4; i++)
{
line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 0, 255), 2);
}
innerRect.points(vertices);
for (int i = 0; i < 4; i++)
{
line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);
}
imshow("image", image);
waitKey(0);
return 0;
}
```
该代码可以从输入图像中检测出最大的轮廓并绘制出最大内接矩形和最小外接矩形。
阅读全文