c++写一个函数OpenCV中已知最小外接矩形获取矩形的四个顶点,不使用cv::boxPoints(),添加注释为哪一个顶点
时间: 2024-03-02 09:50:23 浏览: 208
以下是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()函数绘制四个顶点。注释中标明了各个顶点的位置。
阅读全文