こばや小林 2024-02-17 22:42 采纳率: 85.2%
浏览 3
已结题

如何使用minarearect的参数

如何使用minAreaRect函数?如何使用该函数返回的参数绘制矩形?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-17 22:43
    关注

    引自免费微信小程序:皆我百晓生

    在OpenCV库中,minAreaRect()函数用于计算给定点集的最小面积外接矩形。下面将详细解释如何使用该函数,并展示如何根据返回参数绘制矩形。

    1. 准备点集

    首先,你需要一个包含2D点的向量(std::vector<cv::Point2f>),这些点将用来计算最小面积外接矩形。

    #include <opencv2/opencv.hpp>
    #include <vector>
    
    std::vector<cv::Point2f> points = {
        cv::Point2f(10, 20), cv::Point2f(30, 40), cv::Point2f(50, 60), // 假设你有一些点坐标
        // ... 其他点
    };
    

    2. 使用minAreaRect()函数

    调用cv::minAreaRect()函数来获取最小面积外接矩形:

    cv::RotatedRect rect = cv::minAreaRect(points);
    

    cv::RotatedRect结构体包含了矩形的位置、尺寸和旋转角度信息。

    • center: 矩形中心点坐标
    • size: 矩形的宽和高(cv::Size2f
    • angle: 矩形旋转角度(逆时针方向,单位是度)

    3. 绘制最小面积外接矩形

    接下来,我们可以利用得到的rect参数绘制出这个最小面积外接矩形到图像上。假设你已经有了一个cv::Mat类型的图像img,你可以这样做:

    // 创建一个与原图同样大小的黑色背景图像用于绘制矩形
    cv::Mat img_with_rect = img.clone();
    img_with_rect.setTo(cv::Scalar(0, 0, 0));
    
    // 计算四个顶点
    std::vector<cv::Point> box_points;
    box_points.push_back(cv::Point(rect.boundingRect().tl()));
    box_points.push_back(cv::Point(rect.boundingRect().br()));
    box_points.push_back(cv::Point(rect.boundingRect().tr()));
    box_points.push_back(cv::Point(rect.boundingRect().bl()));
    
    // 转换为旋转后的坐标
    cv::Mat_<float> rot_mat = getRotationMatrix2D(rect.center, -rect.angle, 1.0);
    for (int i = 0; i < 4; ++i)
    {
        cv::Point2f pt(box_points[i]);
        cv::Mat_<float> pt_rot(3,1); 
        pt_rot << pt.x, pt.y, 1;
        rot_mat * pt_rot;
        box_points[i] = cv::Point(pt_rot.at<float>(0) + rect.center.x, pt_rot.at<float>(1) + rect.center.y);
    }
    
    // 绘制矩形轮廓
    cv::polylines(img_with_rect, std::vector<std::vector<cv::Point>>({ box_points }), true, cv::Scalar(0, 255, 0), 2);
    
    // 显示或保存结果图像
    cv::imshow("Min Area Rect", img_with_rect);
    cv::waitKey(0);
    

    请注意,上述代码片段涉及到矩阵旋转操作,这部分是为了准确地按照旋转角度绘制矩形。这里简化了矩阵旋转的过程,实际应用中可能需要根据rect.angle进行更精确的坐标变换。

    由于无法直接在此生成模拟图,请参照以上描述自行理解绘制过程。同时,为了完整运行这段代码,确保你的环境已正确安装并链接了OpenCV库。如有更多问题,请参阅官方文档: OpenCV: minAreaRect

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月17日
  • 创建了问题 2月17日

悬赏问题

  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度
  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下
  • ¥15 android 蓝牙闪退
  • ¥15 绝缘子污秽comsol仿真参数
  • ¥15 labelme生成的json有乱码?