计算点集的最小外接矩形——OpenCV的minAreaRect函数

这篇具有很好参考价值的文章主要介绍了计算点集的最小外接矩形——OpenCV的minAreaRect函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算点集的最小外接矩形——OpenCV的minAreaRect函数

函数原型

输入一系列二维点,返回其最小外接矩形。

RotatedRect minAreaRect( InputArray points );

根据函数原型,输入的数据可以是vector<Point>类型,包含1个以上的点;
返回值是RotatedRect类型,该类型的定义如下:

class CV_EXPORTS RotatedRect
{
public:
    //! default constructor
    RotatedRect();
    /** full constructor
    @param center 矩形的质心
    @param size 矩形的宽和高
    @param angle 顺时针定义的旋转角。当值为0, 90, 180, 270等90的整数倍时,该矩形为直立矩形(底边水平)
    */
    RotatedRect(const Point2f& center, const Size2f& size, float angle);
    RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

    /** returns 返回矩形的四个顶点
    @param pts 顺序是原始矩形的左下、左上、右上、右下顶点(顺时针顺序)。
    */
    void points(Point2f pts[]) const;
    //! returns 返回当前矩形的最小外接直立矩形(坐标为整数)
    Rect boundingRect() const;
    //! returns 返回包含当前矩形的最小外接矩形(坐标为浮点数),不适合用于图像
    Rect_<float> boundingRect2f() const;
    //! returns 质心
    Point2f center;
    //! returns 宽、高
    Size2f size;
    //! returns 矩形相对于直立矩形的旋转角。
    float angle;
};

对于用户而言,最重要的是三个属性:centersizeangle。其中sizeangle需要着重介绍一下:

RotatedRect的size成员变量

某些用户可能认为宽width<高height,但是size成员变量中,并非如此!宽width表示矩形底边的长度,高height表示矩形竖直边的长度。

void points()输出的点坐标顺序

官方文档定义,points输出的点在原始(未旋转)矩形中依次是左下、左上、右上、右下点,说的有些不明不白;
实际上,序号为0的点是minAreaRect返回的矩形最左侧的点,1\2\3号点依次按顺时针确定。请参照下一节的图示。

RotatedRect的angle成员变量

该变量描述了矩阵从直立旋转到当前状态顺时针转过的角度值,其取值范围是[0,90]
换句话说,angle是points()输出的0号点与1号点构成的线段与竖直方向的夹角。请参照下一节的图示。

矩形顶点编号与角度图示

opencv minarearect,c++,MSVC,opencv,c++

opencv minarearect,c++,MSVC,opencv,c++
opencv minarearect,c++,MSVC,opencv,c++

测试代码

给出一段测试代码,方便读者理解该函数:

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

static void help()
{
    cout << "This program demonstrates finding the minimum enclosing box of a set\n"
        << "of points using function: minAreaRect().\n"
        << "Random points are generated and then enclosed.\n\n"
        << "Press ESC, 'q' or 'Q' to exit and any other key to regenerate the set of points.\n\n";
}

int main(int /*argc*/, char** /*argv*/)
{
    help();

    Mat img(500, 500, CV_8UC3, Scalar::all(0));
    RNG& rng = theRNG();

    for (;;)
    {
        int i, count = rng.uniform(1, 101);
        vector<Point> points;

        // Generate a random set of points
        for (i = 0; i < count; i++)
        {
            Point pt;
            pt.x = rng.uniform(img.cols / 4, img.cols * 3 / 4);
            pt.y = rng.uniform(img.rows / 4, img.rows * 3 / 4);

            points.push_back(pt);
        }

        // Find the minimum area enclosing bounding box
        Point2f vtx[4];
        RotatedRect box = minAreaRect(points);
        box.points(vtx);

        img = Scalar::all(0);

        // Draw the points
        for (i = 0; i < count; i++)
            circle(img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA);
        
        // 定义圆弧的参数
        cv::Point center = vtx[0];
        cv::Size axes(10, 10);
        double angle = 0;
        double startAngle = -90; // 圆弧起始角度(以度为单位)
        double endAngle = box.angle-90; // 圆弧结束角度(以度为单位)
        cv::Scalar color(0, 255, 0); // 绿色

        // 在图像上绘制表示角度的圆弧
        cv::ellipse(img, center, axes, angle, startAngle, endAngle, color,2);
        line(img, vtx[0], cv::Point(vtx[0].x,48), Scalar(255, 255, 255), 1, LINE_AA);
        // Draw the bounding box
        for (i = 0; i < 4; i++)
        {
            line(img, vtx[i], vtx[(i + 1) % 4], Scalar(0, 255, 0), 1, LINE_AA);
            putText(img, to_string(i), vtx[i]-cv::Point2f(16,-32), FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 255));
        }
        // Show the text info about the rectangle box.
        cv::String strRectInfo = "The angle is: ";
        strRectInfo += std::to_string(box.angle);
        cv::putText(img, strRectInfo, cv::Point(0, 32), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255,255,255));
        imshow("Rectangle, triangle & circle", img);

        char key = (char)waitKey();
        if (key == 27 || key == 'q' || key == 'Q') // 'ESC'
            break;
    }

    return 0;
}

参考

opencv官方文档文章来源地址https://www.toymoban.com/news/detail-850931.html

到了这里,关于计算点集的最小外接矩形——OpenCV的minAreaRect函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【opencv】示例-minarea.cpp 如何寻找一组随机生成的点的最小外接矩形、三角形和圆...

    此段代码的主要功能是:利用OpenCV库生成随机点集,并计算并展示这些点的最小外包矩形、三角形和圆形。用户可以通过按键重新生成不同的随机点集,或者按ESC/Q退出程序。程序中利用了OpenCV的随机数生成函数、绘图函数以及几何形状的计算函数。

    2024年04月14日
    浏览(56)
  • Halcon画矩形框(正矩形和最小外接矩形)

    1.正矩形框 正矩形框,指的是没有发生倾斜,竖直的矩形框。 该矩形框,不仅能够完全覆盖region区域,而且还不发生倾斜,可以用在一些特定的瑕疵标定。 具体代码如下: 其中,smallest_rectangle1 算子的作用是,获取region的最小外接正矩形。输出Row1(左上y坐标),Column1(左

    2024年02月11日
    浏览(63)
  • 【Python】【OpenCV】绘制外接矩形、外接圆

     外接矩形、外接圆:   1、cv2.boundingRect() Method 和 cv2.minAreaRect() Merhod:前者只寻找和 x、y轴 平行的矩形,后者则可以出现旋转角度。 2、cv2.drawContours() Method:第二个参数接收的是轮廓信息,但是这个轮廓信息需要以 tuple or list or set类型(或者说是iterable)才可以传入。 请注

    2024年02月05日
    浏览(42)
  • 【Python】【OpenCV】绘制外接矩形、外接圆 以及 凸轮廓和Douglas-Peucker算法

     外接矩形、外接圆:   1、cv2.boundingRect() Method 和 cv2.minAreaRect() Merhod:前者只寻找和 x、y轴 平行的矩形,后者则可以出现旋转角度。 2、cv2.drawContours() Method:第二个参数接收的是轮廓信息,但是这个轮廓信息需要以 tuple or list or set类型(或者说是iterable)才可以传入。 请注

    2024年02月05日
    浏览(60)
  • OPENCV C++(七)霍夫线检测+找出轮廓和外接矩形+改进旋转

    霍夫线检测  定义存放输出线的向量 此向量输出有距离,角度 因为检测的原理就是在变换霍夫空间里面去检测的,这里可以理解为极坐标 第3个参数是距离精度 第四个参数是角度精度,第五个是阈值,只有点超过90个才算一条线 在图中画线操作: 这里是画线操作  概率霍夫

    2024年02月13日
    浏览(50)
  • 【技术碎片】【Java】计算椭圆的外接矩形坐标

    遇到一个需要计算一般椭圆(斜椭圆)的外接矩形坐标的问题,在此记录一下 已知椭圆的中心点坐标centerX centerY,椭圆的长轴,短轴majorRadius minorRadius,和旋转角度 angle。 按理说java有原生的计算外接矩形的函数,先看看 java.awt.geom 怎么实现的。 注:java.awt.geom 是 Java 2D 图形

    2024年02月08日
    浏览(54)
  • opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解

    本文主要讲述opencv中的外接多边形的使用: 多边形近似 外接矩形、最小外接矩形 最小外接圆 外接三角形 椭圆拟合 凸包 将重点讲述最小外接矩形的使用 给一个opencv官方的例程: 过程图像如下: 椭圆拟合一般用于轮廓提取之后: 凸包绘制 计算两个旋转矩形交集: C++版的最

    2024年02月09日
    浏览(103)
  • 【OpenCV常用函数:轮廓检测+外接矩形检测】cv2.findContours()+cv2.boundingRect()

    对具有黑色背景的二值图像寻找白色区域的轮廓,因此一般都会先经过cvtColor()灰度化和threshold()二值化后的图像作为输入。 例如,如下的轮廓检测出的结果contours和hierarchy。 根据轮廓点检测对应轮廓的外接矩形

    2024年02月13日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包