opencv类简单分析:RectCvRectFrameRectangleSizeRotatedRect

Posted arvik

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv类简单分析:RectCvRectFrameRectangleSizeRotatedRect相关的知识,希望对你有一定的参考价值。

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

定义

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);
  • 效果
    图中红线交叉点是质点,绿色斜矩形就是该旋转矩形,外面蓝色正向的矩形就是包含旋转矩形的最小正向矩形

以上是关于opencv类简单分析:RectCvRectFrameRectangleSizeRotatedRect的主要内容,如果未能解决你的问题,请参考以下文章

opencv类简单分析:RectCvRectFrameRectangleSizeRotatedRect

opencv类简单分析: CascadeClassifier

opencv类简单分析: CascadeClassifier

opencv常用api简单分析: imread()

Opencv2.4.9源码分析——Stitching

Opencv2.4.9源码分析——Stitching