对于刚开始学习Opencv的朋友们,查找资料是自学最好的方式。
这一篇博客,我将介绍Opencv中Rect、RotatedRect类与boundingRect( )、minAreaRect( )、fitEllipse( )函数,如有问题或建议可留言于我,谢谢!
更多资料请点击:我的目录
Rect类包含了函数boundingRect( )返回的结果。
boundingRect( )函数返回参数如下:
rect.area(); //返回rect的面积
rect.size(); //返回rect的尺寸
rect.tl(); //返回rect的左上顶点的坐标
rect.br(); //返回rect的右下顶点的坐标
rect.width(); //返回rect的宽度
rect.height(); //返回rect的高度
rect.contains(Point(x, y)); //返回布尔变量,判断rect是否包含Point(x, y)点
RotatedRect类包含了最小外包矩形函数minAreaRect( )和椭圆拟合函数fitEllipse( )返回的结果。RotatedRect类是一个存储旋转矩形的类,通常用来存储最小外包矩形函数minAreaRect( )和椭圆拟合函数fitEllipse( )返回的结果。存储的值,完全取决在于函数的返回。
class CV_EXPORTS RotatedRect
{
public:
//构造函数
RotatedRect();
RotatedRect(const Point2f& center, const Size2f& size, float angle);
RotatedRect(const CvBox2D& box);
//!返回矩形的4个顶点
void points(Point2f pts[]) const;
//返回包含旋转矩形的最小矩形
Rect boundingRect() const;
//!转换到旧式的cvbox2d结构
operator CvBox2D() const;
Point2f center; //矩形的质心
Size2f size; //矩形的边长
float angle; //旋转角度,当角度为0、90、180、270等时,矩形就成了一个直立的矩形
};
OpenCV中,坐标的原点在左上角,与x轴平行的方向为角度为0,逆时针旋转角度为负,顺时针旋转角度为正,minAreaRect( )函数和fitEllipse( )函数返回值不太一样。
minAreaRect( )函数返回参数如图:
角点顺序是固定以最下面的点为P[0],顺时针依次递增编号的。将水平轴逆时针旋转,最先与水平轴平行的边作为宽width,另外一条边则为高height,并非长的就是height,短的就是width。而角度则直接取最先与水平轴平行的边与水平轴的夹角,取值范围[-90~0]。
fitEllipse( )函数返回参数如图:
角度参数angle 是椭圆中心center发出的平行于x轴的射线,顺时针旋转,与椭圆短轴的夹角,取值范围 [ 0 ~ 180 ]。椭圆的短轴为参数宽width,长轴为参数长height。
示例程序:
vector<vector<Point>>contours;
vector<Vec4i>hierarchy;
findContours(bin_img,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
vector<RotatedRect>minRects(contours.size());
vector<Rect> boundRect(contours.size());
for (uint i = 0; i < contours.size(); ++i)
{
boundRect[i] = boundingRect(Mat(contours[i]));
minRects[i] = minAreaRect(Mat(contours[i]));
}
更多资料请点击:我的目录