使用C++版opencv,已知四个点可以组成一个带角度的矩形,如何通过这四个点构造cv::RotatedRect
时间: 2023-12-14 07:37:36 浏览: 210
可以使用以下代码来构造cv::RotatedRect:
```c++
#include <opencv2/opencv.hpp>
int main()
{
// 已知四个点,假设这四个点为 p1, p2, p3, p4
cv::Point2f p1(10, 10);
cv::Point2f p2(50, 10);
cv::Point2f p3(50, 30);
cv::Point2f p4(10, 30);
// 构造矩形的中心点和大小
cv::Point2f center((p1.x + p3.x) / 2, (p1.y + p3.y) / 2);
cv::Size2f size(cv::norm(p3 - p2), cv::norm(p2 - p1));
// 计算矩形的倾斜角度
float angle = std::atan2(p2.y - p1.y, p2.x - p1.x) * 180 / CV_PI;
// 构造cv::RotatedRect
cv::RotatedRect rect(center, size, angle);
return 0;
}
```
其中,cv::Point2f 表示二维坐标点,cv::Size2f 表示二维大小,cv::RotatedRect 表示带角度的矩形。函数 cv::norm(x) 可以计算向量 x 的模长。
相关问题
使用C++版opencv,已知四个点可以组成一个带角度的矩形,如何通过这四个点构造一个带角度矩形?
可以通过以下步骤构造一个带角度矩形:
1. 将四个点按照顺序连接成一条闭合的轮廓线。
2. 使用OpenCV中的 `minAreaRect()` 函数计算出该轮廓线所在的最小矩形。
3. 得到该最小矩形的中心点、宽度、高度、旋转角度等参数。
4. 使用这些参数构造一个自定义的矩形结构体,即可得到一个带角度的矩形。
下面是一个简单的示例代码,仅供参考:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// 自定义矩形结构体
struct RotatedRectCustom {
Point2f center;
float width;
float height;
float angle; // 旋转角度,单位:度
};
int main() {
// 定义四个点
vector<Point2f> points = {Point2f(100, 100), Point2f(200, 100), Point2f(200, 200), Point2f(100, 200)};
// 构造轮廓线
vector<vector<Point2f>> contours = {points};
// 计算最小矩形
RotatedRect rect = minAreaRect(points);
// 构造自定义矩形结构体
RotatedRectCustom rect_custom;
rect_custom.center = rect.center;
rect_custom.width = rect.size.width;
rect_custom.height = rect.size.height;
rect_custom.angle = rect.angle;
// 打印结果
cout << "Center: " << rect_custom.center << endl;
cout << "Width: " << rect_custom.width << endl;
cout << "Height: " << rect_custom.height << endl;
cout << "Angle: " << rect_custom.angle << " degrees" << endl;
return 0;
}
```
c++写一个函数OpenCV中已知最小外接矩形获取矩形的四个顶点,不使用cv::boxPoints(),添加注释为哪一个顶点
以下是C++代码实现,使用了cv::RotatedRect类和cv::Point2f类来计算最小外接矩形的四个顶点,并按照顺时针方向将它们存储到了一个std::vector<cv::Point2f>中。注释中标明了各个顶点的位置。
```
#include <opencv2/opencv.hpp>
#include <vector>
std::vector<cv::Point2f> getRectCorners(const cv::RotatedRect& rect)
{
std::vector<cv::Point2f> corners(4);
cv::Point2f center = rect.center;
// 旋转矩形的四个顶点
cv::Point2f vtx[4];
rect.points(vtx);
// 对顶点进行排序,按照顺时针方向存储到 corners 容器中
for (int i = 0; i < 4; i++)
{
cv::Point2f v = vtx[i];
if (v.x < center.x && v.y < center.y)
{
corners[1] = v; // 左上角
}
else if (v.x >= center.x && v.y < center.y)
{
corners[2] = v; // 右上角
}
else if (v.x >= center.x && v.y >= center.y)
{
corners[3] = v; // 右下角
}
else
{
corners[0] = v; // 左下角
}
}
return corners;
}
int main()
{
// 创建一个旋转矩形
cv::RotatedRect rect(cv::Point2f(100, 100), cv::Size2f(200, 100), -45);
// 获取最小外接矩形的四个顶点
std::vector<cv::Point2f> corners = getRectCorners(rect);
// 在图像中绘制矩形和顶点
cv::Mat img = cv::Mat::zeros(512, 512, CV_8UC3);
cv::Point2f p1 = corners[0];
cv::Point2f p2 = corners[1];
cv::Point2f p3 = corners[2];
cv::Point2f p4 = corners[3];
cv::line(img, p1, p2, cv::Scalar(0, 0, 255), 2);
cv::line(img, p2, p3, cv::Scalar(0, 0, 255), 2);
cv::line(img, p3, p4, cv::Scalar(0, 0, 255), 2);
cv::line(img, p4, p1, cv::Scalar(0, 0, 255), 2);
cv::circle(img, p1, 5, cv::Scalar(0, 255, 0), -1);
cv::circle(img, p2, 5, cv::Scalar(0, 255, 0), -1);
cv::circle(img, p3, 5, cv::Scalar(0, 255, 0), -1);
cv::circle(img, p4, 5, cv::Scalar(0, 255, 0), -1);
cv::imshow("image", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
```
在上面的代码中,getRectCorners()函数接收一个cv::RotatedRect类型的参数,表示最小外接矩形的信息。函数内部使用cv::RotatedRect::points()函数获取旋转矩形的四个顶点,并按照顺时针方向将它们存储到一个std::vector<cv::Point2f>中。在主函数中,使用cv::line()函数绘制矩形边框,使用cv::circle()函数绘制四个顶点。注释中标明了各个顶点的位置。
阅读全文