从原图中截取cv::RotatedRect minRect,不对原图进行变换
时间: 2024-03-29 19:40:02 浏览: 122
好的,您可以使用 OpenCV 中的 cv::minAreaRect() 函数来获取一个包含轮廓的最小矩形,也就是 cv::RotatedRect 对象。这个函数的输入参数是一个二值化的图像或者是一个轮廓向量,返回的就是最小矩形。具体实现可以参考以下代码:
```c++
cv::Mat src; // 原图
cv::Mat binary; // 二值化后的图像
std::vector<std::vector<cv::Point>> contours; // 轮廓向量
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 查找轮廓
// 获取最小矩形
cv::RotatedRect minRect = cv::minAreaRect(contours[0]); // 假设只有一个轮廓
// 在原图中绘制最小矩形
cv::Point2f vertices[4];
minRect.points(vertices);
for (int i = 0; i < 4; ++i)
cv::line(src, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 2);
```
这样就可以在原图中绘制出最小矩形了,而不需要对原图进行任何变换。
相关问题
最小外接矩形cv::minAreaRect minRect的最大外接矩形Rect
最小外接矩形cv::minAreaRect返回的是一个旋转矩形(RotatedRect),包含了最小外接矩形的信息,其中包括矩形中心点坐标、宽度、高度、旋转角度等信息。如果要获取最小外接矩形的最大外接矩形,可以使用RotatedRect的boundingRect()函数,将旋转矩形转换为最大外接矩形(Rect)。
从原图中截取cv::RotatedRect minRect区域为新的cv::Mat,不对原图进行变换
好的,您可以通过以下步骤来实现从原图中截取 cv::RotatedRect minRect 区域为新的 cv::Mat,而不对原图进行任何变换:
1. 获取最小矩形的四个顶点坐标:
```c++
cv::Point2f vertices[4];
minRect.points(vertices);
```
2. 计算最小矩形的宽度和高度:
```c++
float width = minRect.size.width;
float height = minRect.size.height;
```
3. 将最小矩形的顶点坐标按照左上、右上、右下、左下的顺序排序:
```c++
// 找到最小矩形的左上角和右下角顶点坐标
int leftTopIndex = 0;
for (int i = 1; i < 4; ++i) {
if (vertices[i].x + vertices[i].y < vertices[leftTopIndex].x + vertices[leftTopIndex].y) {
leftTopIndex = i;
}
}
int rightBottomIndex = 0;
for (int i = 1; i < 4; ++i) {
if (vertices[i].x + vertices[i].y > vertices[rightBottomIndex].x + vertices[rightBottomIndex].y) {
rightBottomIndex = i;
}
}
// 找到最小矩形的右上角和左下角顶点坐标
int rightTopIndex = (leftTopIndex + 1) % 4;
int leftBottomIndex = (rightBottomIndex + 1) % 4;
// 按照左上、右上、右下、左下的顺序存储顶点坐标
cv::Point2f sortedVertices[4];
sortedVertices[0] = vertices[leftTopIndex];
sortedVertices[1] = vertices[rightTopIndex];
sortedVertices[2] = vertices[rightBottomIndex];
sortedVertices[3] = vertices[leftBottomIndex];
```
4. 计算最小矩形的旋转角度:
```c++
float angle = minRect.angle;
```
5. 创建一个新的 cv::Mat 对象,大小为最小矩形的宽度和高度:
```c++
cv::Mat dst(height, width, CV_8UC3, cv::Scalar(0, 0, 0));
```
6. 构建仿射变换矩阵,将最小矩形变换为水平矩形:
```c++
// 计算仿射变换矩阵
cv::Point2f srcPoints[4];
srcPoints[0] = sortedVertices[0];
srcPoints[1] = sortedVertices[1];
srcPoints[2] = sortedVertices[2];
srcPoints[3] = sortedVertices[3];
cv::Point2f dstPoints[4];
dstPoints[0] = cv::Point2f(0, 0);
dstPoints[1] = cv::Point2f(width - 1, 0);
dstPoints[2] = cv::Point2f(width - 1, height - 1);
dstPoints[3] = cv::Point2f(0, height - 1);
cv::Mat transform = cv::getAffineTransform(srcPoints, dstPoints);
// 将最小矩形变换为水平矩形
cv::Mat rotated;
cv::warpAffine(src, rotated, transform, cv::Size(width, height));
```
7. 在新的 cv::Mat 中截取最小矩形区域:
```c++
cv::Rect rect(0, 0, width, height);
cv::Mat result = rotated(rect);
```
这样就可以得到一个新的 cv::Mat 对象 result,它包含了原图中最小矩形的区域,而且不对原图进行任何变换。
阅读全文