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