template<typename _Tp> class CV_EXPORTS Rect_
{
public:
typedef _Tp value_type;
//! various constructors
Rect_();
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
Rect_(const Rect_& r);
Rect_(const CvRect& r);
Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);
Rect_& operator = ( const Rect_& r );
//! the top-left corner
Point_<_Tp> tl() const;
//! the bottom-right corner
Point_<_Tp> br() const;
//! size (width, height) of the rectangle
Size_<_Tp> size() const;
//! area (width*height) of the rectangle
_Tp area() const;
//! conversion to another data type
template<typename _Tp2> operator Rect_<_Tp2>() const;
//! conversion to the old-style CvRect
operator CvRect() const;
//! checks whether the rectangle contains the point
bool contains(const Point_<_Tp>& pt) const;
_Tp x, y, width, height; //< the top-left corner, as well as width and height of the rectangle
};
二维矩形的模板类,包含以下参数:
左上角的坐标值、矩形的宽和高
OpenCV是设定矩形的上边界以及左边界是被包含,而右边界以及下边界是不被包含的,所以执行Rect_::contains函数时,只有在满足下面这个条件才会返回true:
x <= pt.x < x + width, y<= pt.y < y + height
在设置ROI的时候,函数的实现为:
for(int y = roi.y; y < roi.y + rect.height; y++)
{
for(int x = roi.x; x< roi.x+rect.width; x++)
{
//...
}
}
与Rect_有关的运算:
rect = rect +- point (将矩形的左上点移动到point处)
rect = rect +- size(将矩形的长宽增加或减少相应的值,结果可以是负值)
rect += point, rect -= point, rect += size, rect -= size (同上)
rect = rect1 & rect2 (交集)
rect = rect1 | rect2 (获取能够同时包含rect1和rect2的最小矩形)
rect &= rect1, rect |= rect1 (同上)
rect == rect1, rect != rect1(比较)