Opencv中rectangle函数与Rect函数的用法


rectangle函数是用来绘制一个矩形框的,通常用在图片的标记上。

1.rectangle(img2, Point(j,i), Point(j + img4.cols, i + img4.rows), Scalar(255, 255, 0), 2, 8);

img2:被处理的图片
Point(j,i)代表矩形左上点的坐标
Point(j + cols, i + rows)代表矩形右下点的坐标【矩形的大小(cols,rows】
scalar:颜色
2代表线条宽度
8是线型,默认取8
Rect()函数是画出图像中的矩形
Rect(x,y,width,height)x, y为左上角坐标,width, height则为长和宽。

Rect roi_rect = Rect(128, 128, roi.cols, roi.rows);

一、 rect()类

template<typename _Tp> class Rect_
{
public:
    typedef _Tp value_type;
 
    //! various constructors
    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 );
    //! 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;
 
    //! 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
};

Rect_(),形参列表为空,即定义一个空窗口(默认值为:x=y=width=height=0);
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height),定义一个左上角点坐标为(_x, _y)_width*_height矩形窗口;(重点)
Rect_(const Rect_& r),使用其他的Rect_对象初始化;
Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz),分别将位置坐标(_x, _y)和窗口大小(_width, _height)Point_和Size_对象初始化;

Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2),分别将坐标位置(_x, _y)和窗口大小(_width, _height)Point_和Point_对象初始化。

//如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能:  
rect.area();     //返回rect的面积 5000  
rect.size();     //返回rect的尺寸 [50 × 100]  
rect.tl();       //返回rect的左上顶点的坐标 [100, 50]  
rect.br();       //返回rect的右下顶点的坐标 [150, 150]  
rect.width();    //返回rect的宽度 50  
rect.height();   //返回rect的高度 100  
rect.contains(Point(x, y));  //返回布尔变量,判断rect是否包含Point(x, y)点  
  
//还可以求两个矩形的交集和并集  
rect = rect1 & rect2;  
rect = rect1 | rect2;  
  
//还可以对矩形进行平移和缩放    
rect = rect + Point(-100, 100); //平移,也就是左上顶点的x坐标-100,y坐标+100  
rect = rect + Size(-100, 100);  //缩放,左上顶点不变,宽度-100,高度+100  
  
//还可以对矩形进行对比,返回布尔变量  
rect1 == rect2;  
rect1 != rect2;  
  
//OpenCV里貌似没有判断rect1是否在rect2里面的功能,所以自己写一个吧  
bool isInside(Rect rect1, Rect rect2)  
{  
    return (rect1 == (rect1&rect2));  
}  
  
//OpenCV貌似也没有获取矩形中心点的功能,还是自己写一个  
Point getCenterPoint(Rect rect)  
{  
    Point cpt;  
    cpt.x = rect.x + cvRound(rect.width/2.0);  
    cpt.y = rect.y + cvRound(rect.height/2.0);  
    return cpt;  
}  
  
//围绕矩形中心缩放  
Rect rectCenterScale(Rect rect, Size size)  
{  
    rect = rect + size;   
    Point pt;  
    pt.x = cvRound(size.width/2.0);  
    pt.y = cvRound(size.height/2.0);  
    return (rect-pt);  
}  

二、rectangle()函数

void rectangle(InputOutputArray img, Point pt1, Point pt2,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);

简介:使用对角线的两点pt1,pt2画一个矩形轮廓或者填充矩形

@param img Image.
@param pt1 Vertex of the rectangle.
@param pt2 Vertex of the rectangle opposite to pt1 .
@param color Rectangle color or brightness (grayscale image).color 线条颜色 (RGB) 或亮度(灰度图像 )
@param thickness Thickness of lines that make up the rectangle. Negative values, like CV_FILLED ,
mean that the function has to draw a filled rectangle.thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形

@param lineType Type of the line.

//! type of line
enum LineTypes {
    FILLED  = -1,
    LINE_4  = 4, //!< 4-connected line
    LINE_8  = 8, //!< 8-connected line
    LINE_AA = 16 //!< antialiased line
};

简介:使用矩阵类rec画一个矩形轮廓或者填充矩形

其他参数同上;

rectangle(matImage,Point(20,200),Point(200,300),Scalar(255,0,0),1,1,0);  
 //Rect(int a,int b,int c,int d)a,b为矩形的左上角坐标,c,d为矩形的长和宽  
rectangle(matImage,Rect(100,300,20,200),Scalar(0,0,255),1,1,0); 

简介:使用矩阵类rec画一个矩形轮廓或者填充矩形

三、应用

1. 绘制简单、指定粗细或者带填充的 矩形

void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,
                  int thickness=1, int line_type=8, int shift=0 );
img
    图像.
pt1
    矩形的一个顶点。
pt2
    矩形对角线上的另一个顶点
color
    线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
thickness
    组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
line_type
    线条的类型。见cvLine的描述
shift
    坐标点的小数点位数。
     
//包含程序所使用的头文件和命名空间
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
using	namespace cv;
//宏定义部分
#define Win_Name3 "Cross  红十字"
//main函数
int main(int argc,char** argv)
{	
<span style="white-space:pre">	</span>//绘制红十字
	Mat	image3 = Mat::zeros(800, 800, CV_8UC3);//生成一个800x800的窗口
	Rect rec1 = Rect(100, 300, 600, 200);
	Rect rec2 = Rect(300, 100, 200, 600);
	rectangle (image3,  rec1,Scalar(0, 0, 255), -1, 8, 0);//横矩形
	rectangle (image3, rec2, Scalar(0, 0, 255), -1, 8, 0);//竖矩形
	rectangle (image3, Point(100, 300), Point(700, 500), Scalar(0, 255, 255), 2, 8, 0);//黄色矩形镶边
	rectangle(image3, Point(300, 100), Point(500, 700), Scalar(0, 255, 255), 2, 8, 0);//黄色矩形镶边
	rectangle(image3, Point(300, 300), Point(500, 500), Scalar(0, 0, 255), 3, 8);//红色正方形覆盖(中央)
	imshow(Win_Name3, image3);
	waitKey();
	return 0;
}

2. Circle绘制圆形。

void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color,
               int thickness=1, int line_type=8, int shift=0 );
img
    图像。
center
    圆心坐标。
radius
    圆形的半径。
color
    线条的颜色。
thickness
    如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充。
line_type
    线条的类型。见 cvLine 的描述
shift
    圆心坐标点和半径值的小数点位数。
    函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b )
#include<opencv2/core/core.hpp> //包含程序所使用的头文件和命名空间
#include<opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
using	namespace cv;
#define Win_Name2 "Audi 奥迪"
int main(int argc, char** argv)
{
	//绘制奥迪Audi车标
	Mat image2 = Mat::zeros(600, 850, CV_8UC3);//生成一个850x600的窗口
	circle(image2, Point(200, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(200,300),颜色为紫色
	circle(image2, Point(350, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(350,300),线宽为7
	circle(image2, Point(500, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(500,300)
	circle(image2, Point(650, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(650,300)
	imshow(Win_Name2, image2);
	waitKey();
	return 0;
}

3. Ellipse绘制椭圆圆弧和椭圆扇形

void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle,
                double start_angle, double end_angle, CvScalar color,
                int thickness=1, int line_type=8, int shift=0 );
img
    图像。
center
    椭圆圆心坐标。
axes
    轴的长度。
angle
    偏转的角度。
start_angle
    圆弧起始角的角度。.
end_angle
    圆弧终结角的角度。
color
    线条的颜色。
thickness
    线条的粗细程度。
line_type
    线条的类型,见CVLINE的描述。
shift
    圆心坐标点和数轴的精度。

函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略。反走样弧线和粗弧线使用线性分段近似值。所有的角都是以角度的形式给定的。
//----------------基本几何图像的绘制---------------
//包含程序所使用的头文件和命名空间
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
using	namespace cv;
#define Win_Name1 "Toyota 丰田" <span style="font-size: 13.3000001907349px; font-family: Tahoma, 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif;">//宏定义部分</span>
//main函数
int main(int argc, char** argv)
{
	//绘制丰田车标
	Mat	image1 = Mat::zeros(900, 900, CV_8UC3);//900x900的窗口
	ellipse(image1, Point(450, 450), Size(400, 250), 0, 0, 360, Scalar(0, 0, 225), 5, 8);//绘制第一个椭圆,大椭圆,颜色为红色
	ellipse(image1, Point(450, 450), Size(250, 110), 90, 0, 360, Scalar(0, 0, 225), 5, 8);//绘制第二个椭圆,竖椭圆
	ellipse(image1, Point(450, 320), Size(280, 120), 0, 0, 360, Scalar(0, 0, 225), 5, 8);//绘制第三个椭圆,小椭圆(横)
	imshow(Win_Name1, image1);
	waitKey();
	return 0;
}

https://blog.csdn.net/wwwlyj123321/article/details/80563114
https://blog.csdn.net/sinat_34707539/article/details/51912610

  • 29
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值