opencv类简单分析:Rect、CvRect、FrameRectangle、Size、RotatedRect

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012819339/article/details/82217667

这几个类或者结构体都是一目了然

定义

Rect

Rect的定义其实只是一个别名,如下,它最终是由Rect_模板得来的

typedef Rect_<int> Rect2i;
typedef Rect_<float> Rect2f;
typedef Rect_<double> Rect2d;
typedef Rect2i Rect;

分析下Rect_

template<typename _Tp> class Rect_
{
public:
    typedef _Tp value_type;

    //构造函数
    Rect_();
    Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
    Rect_(const Rect_& r);
    Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
    Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);

    Rect_& operator = ( const Rect_& r );
    //左上角点
    Point_<_Tp> tl() const;
    //右下角点
    Point_<_Tp> br() const;

    //矩形的大小(宽度,高度)
    Size_<_Tp> size() const;
    //矩形的面积(宽*高)
    _Tp area() const;
    //判空
    bool empty() const;

    //转换到另一种数据类型
    template<typename _Tp2> operator Rect_<_Tp2>() const;

    //检查指定点是否在该矩形内
    bool contains(const Point_<_Tp>& pt) const;

    _Tp x; //左上角的x坐标
    _Tp y; //左上角的y坐标
    _Tp width; //矩形的宽度
    _Tp height; //矩形的高度
};

CvRect

CvRect仅仅看做是一个C类型的结构体,它只有x,y,width,height四个成员而已

typedef struct CvRect
{
    int x;
    int y;
    int width;
    int height;

#ifdef __cplusplus
    CvRect(int _x = 0, int _y = 0, int w = 0, int h = 0): x(_x), y(_y), width(w), height(h) {}
    template<typename _Tp>
    CvRect(const cv::Rect_<_Tp>& r): x(cv::saturate_cast<int>(r.x)), y(cv::saturate_cast<int>(r.y)), width(cv::saturate_cast<int>(r.width)), height(cv::saturate_cast<int>(r.height)) {}
    template<typename _Tp>
    operator cv::Rect_<_Tp>() const { return cv::Rect_<_Tp>((_Tp)x, (_Tp)y, (_Tp)width, (_Tp)height); }
#endif
}
CvRect;

FrameRectangle

存储框架矩形尺寸

同CvRect结构体

typedef struct {
  int x_offset_, y_offset_, width_, height_;
} FrameRectangle;

Size

Size的定义其实只是一个别名,如下,它最终是由Size_模板得来的

typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> Size2d;
typedef Size2i Size;

用于指定图像或矩形大小的模板类

template<typename _Tp> class Size_
{
public:
    typedef _Tp value_type;

    //默认类
    Size_();
    Size_(_Tp _width, _Tp _height);
    Size_(const Size_& sz);
    Size_(const Point_<_Tp>& pt);

    Size_& operator = (const Size_& sz);
    //面积(宽*高) 
    _Tp area() const;
    //判空,空为真
    bool empty() const;

    //转换到另一种数据类型
    template<typename _Tp2> operator Size_<_Tp2>() const;

    _Tp width; //宽
    _Tp height; //高
}

RotatedRect

这是一个旋转矩形类,它有以下特点
1. 矩形中心点(质心)
2. 边长(长和宽)
3. 旋转角度

class CV_EXPORTS RotatedRect
{
public:
    // 默认构造函数
    RotatedRect();
    /** 完整构造函数
    参数:
    center 矩形的质点(旋转中心).
    size 矩形的宽度和高度.
    angle 以顺时针方向旋转的角度。当角度是0 90 180 270...的时候,这个矩形变成了一个向上向右的矩形
    */
    RotatedRect(const Point2f& center, const Size2f& size, float angle);

    //旋转矩形的任意3个端点。它们必须按顺时针或逆时针顺序排列
    RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

    /** 
    返回矩形的四个顶点
    参数:
    pts 用于存储矩形顶点的点数组。顺序是左下,左上,右上,右下。
    */
    void points(Point2f pts[]) const;

    //返回包含旋转矩形的最小正向(向上向右)整数矩形
    Rect boundingRect() const;

    //返回包含旋转矩形的最小(精确)浮点矩形,不针对图像
    Rect_<float> boundingRect2f() const;

    //返回旋转中心的质点/中心点
    Point2f center;
    //返回旋转矩形的大小
    Size2f size;
    //返回旋转角度。当角度为0、90、180、270等时,这个矩形就变成了一个向右的矩形。
    float angle;
};
  • 坐标图
    这里写图片描述

  • 列子

int main(int argc, char *argv[]){

 Mat test_image(200, 200, CV_8UC3, Scalar(0));
    RotatedRect rRect = RotatedRect(Point2f(100,100), Size2f(100,50), 30);
    Point2f vertices[4];
    rRect.points(vertices);
    for (int i = 0; i < 4; i++)
    {
        line(test_image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0), 3);
        line(test_image, vertices[i], Point2f(100,100), Scalar(0,0,255), 1);
    }
    Rect brect = rRect.boundingRect();
    rectangle(test_image, brect, Scalar(255,0,0), 3);
    imshow("rectangles", test_image);
    waitKey(0);
}
  • 效果
    图中红线交叉点是质点,绿色斜矩形就是该旋转矩形,外面蓝色正向的矩形就是包含旋转矩形的最小正向矩形
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012819339/article/details/82217667