精华内容
下载资源
问答
  • Opencv中rectangle函数与Rect函数的用法

    千次阅读 2020-06-01 15:14:59
    rectangle函数是用来绘制一个矩形框的,通常用在图片的标记上。 1.rectangle(img2, Point(j,i), Point(j + img4.cols, i + img4.rows), Scalar(255, 255, 0), 2, 8); img2:被处理的图片 Point(j,i)代表矩形左上...


    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

    展开全文
  • 在学习直方图的时候,笔者发现了一个问题,在看官方的文档说明,也就是opencv_tutorials时候,在看imgproc module这个板块的实例说明的时候,学习Histogram Calculation的时候发现函数rectangle函数没有说明有点让...

    最近在学习OpenCV3.0左右的版本,在学习直方图的时候,笔者发现了一个问题,在看官方的文档说明,也就是opencv_tutorials时候,在看imgproc module这个板块的实例说明的时候,学习Histogram Calculation的时候发现函数rectangle函数没有说明有点让人模凌两可,模糊不清,设置有点丈二和尚摸不着头脑,我们且看一下关于rectangle函数的说明:

    其中关于坐标点pt1以及pt2的说明一个矩形的一个顶点,pt2则是相对pt1的另外一点,即确定一个矩形,只需要矩形对角线上的两点即可,这个很好理解。但是指定这两个点的时候是很有考究的。笔者做了一个测试,测试代码为,当然笔者最近在这一个关于图像处理的一个小型的MFC程序,正在构建阶段,因此直接在该程序框架上试验:

    void CMFC_OpenCVtestDlg::OnGrayHist()
    {
    	// TODO:  在此添加命令处理程序代码
    	Mat image(img);
    
    	cvtColor(image,image,CV_BGR2GRAY);
    	float range[] = { 0, 255 };
    	const float *histRange[] = { range };
    	MatND dsthist;
    	int bins = 256;
    	int hist_size[] = { bins };
    	int channnels = 0;
    	//------------------------------------------------------//
    	calcHist(&image, 1, &channnels, Mat(), dsthist, 1, hist_size, histRange, true, false);
    	double max_Value, min_Value;
    	minMaxLoc(dsthist, &min_Value, &max_Value, 0, 0);
    
    	int histHeight = 256;
    	Mat Histimage = Mat::zeros(histHeight, bins, CV_8UC3);
    	IplImage *pImage;
    	for (int i = 0; i < bins; i++)
    	{
    		float binValue = dsthist.at<float>(i);
    		int intensity = cvRound(binValue*histHeight / max_Value);
    		rectangle(Histimage, Point(i, histHeight - 1), Point(i + 1, histHeight - intensity), Scalar(255,128,64));
    	}
    
    	//imshow("Hist",Histimage);
    	pImage = &Histimage.operator IplImage();
    	DrawToMFC(IDC_PROG, pImage);
    	GetDlgItem(IDC_Hist)->SetWindowTextA("灰色直方图");
    }
    

    其中:img是一个IplImage *类型的变量,这是一个全局变量,主要是因为在OpenCV2.2版本以后,CvvImage类被取消掉了,因此在OpenCV3.0与MFC结合,在picture控件上显示图像时出现了麻烦,因此将CvvImage.cpp以及CvvImage.h拷贝到了工程目录下使用。而CvvImage类的成员函数Copyof(IplImage *pImage)只接受IplImage *类型的变量,因此定义了一个该全局变量(ps:这个真是对程序的说明,不是本文讨论的重点)

    void CMFC_OpenCVtestDlg::DrawToMFC(int Ctrol_ID, IplImage * pImage)
    {
    	CDC* pDC = GetDlgItem(Ctrol_ID)->GetDC();
    	HDC hDC = pDC->GetSafeHdc();
    	CvvImage cimg;
    	cimg.CopyOf(pImage);
    	CRect rect;
    	GetDlgItem(Ctrol_ID)->GetClientRect(&rect);
    	cimg.DrawToHDC(hDC, &rect);
    	ReleaseDC(pDC);
    }


    错误理解:在函数OnGrayHist()中,关于pt1,pt2的设置是:Point(i, histHeight - 1), Point(i + 1, histHeight - intensity);

    如果我们将pt1,pt2理解为一个矩形的左上角坐标以及右上角坐标,那么疑问就来了,岂不是每一个直方图的点都在最顶端,画出来的矩形和我们理解的矩形就是倒着的了,笔者也是这么认为的,因此看了良久,决定把代码改了,把pt1,pt2的坐标改为了:Point(i, 0), Point(i + 1, intensity);这样画出来的矩形就应该和我们想象中的一样了,结果却不是这样的:

    恰恰和我们理解的相反,因此正确的理解应该是这样的:

    在计算过程中,intensity是相应的统计点的数量,Height是画图区域的高,在点pt1的横坐标表示的统计点,也就是像素1到256的点,在区域中表示为横坐标,而纵坐标则不是表示的到横坐标的纵向距离,而是到画图区域最高点的距离,因此设置为Height,则等同于到横坐标的纵向距离为0;p2的解释也就更能理解了,i+1表示矩形的宽度为1,

    而纵坐标Height-intensity则是该统计点的高度,也就是频数。因此将pt1和pt2理解为左下角和右上角的含义才更为贴切。

    为了验证想法否正确,将rectangle()函数的相应代码修改:

    rectangle(Histimage, Point(i, histHeight - 1), Point(i + 1, histHeight - intensity_red), Scalar(0, 0, 255));
    最后的结果是:






    展开全文
  • rectangle函数是用来绘制一个矩形框的,通常用在图片的标记上。 rectangle(img, Point(j,i), Point(j + img4.cols, i + img4.rows), Scalar(255, 255, 0), 2, 8); img:被处理的图片 Point(j,i)代表矩形左上点的...
    rectangle函数是用来绘制一个矩形框的,通常用在图片的标记上。
    rectangle(img, Point(j,i), Point(j + img4.cols, i + img4.rows), Scalar(255, 255, 0), 2, 8);
    img:被处理的图片
    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);
    
    展开全文
  • rectangle函数就是绘制一个矩形框,它有两种形式,一种是输入左上角和右下角的点的x和y坐标,即Point,另一种是输入一个Rect。分别如下: CV_EXPORTS_W void rectangle(CV_IN_OUT Mat& img, Point pt1, Point ...

    rectangle函数就是绘制一个矩形框,它有两种形式,一种是输入左上角和右下角的点的x和y坐标,即Point,另一种是输入一个Rect。分别如下:

    CV_EXPORTS_W void rectangle(CV_IN_OUT Mat& img, Point pt1, Point pt2,
                              const Scalar& color, int thickness=1,
                              int lineType=8, int shift=0);

    CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec,
                              const Scalar& color, int thickness=1,
                              int lineType=8, int shift=0);

    第一种形式绘制出来的矩形框包括右下角的位置,是一种真包含的关系。打个比方,如果左上角是(0,0),右下角是(1,1),画出来的是2个像素宽度和2个像素高度的矩形区域。

    第二种形式的实现里也是调用了第一种形式。Rect的br()返回的是左上角的点坐标加上宽度和高度的偏移量,在调用第一种形式时,减掉了1,这样刚好绘制出来的矩形区域就等于Rect的宽度和高度之积。

    所以要理解第一种形式中的pt2的坐标和第二种形式rec的br()返回的点的坐标是不同的。

    而在Windows下绘制矩形框使用API函数Rectangle的行为就不同了,它传入左、上、右、下四个坐标,绘制出来的区域是不包含右边和下边的,这和上面的第二种形式有些类似。亲测发现,它对于右坐标小于左坐标,下坐标小于上坐标的情况还会进行交换,然后绘制出来的区域是不包含右下坐标对应的边。

    此外,OpenCV画线段的函数line和Windows下画线段的函数LineTo也有类似的区别,即Windows下画出来的线段的是不包含末端那个点的,而OpenCV的是包含的。

    感言:调用一个别人实现的东西,就像面对一个黑盒子,你永远不知道它里面是什么。即使有源码,要跟进去看个究竟,也耗时耗力。黑盒子还是少碰,没有源码的东西,遇到问题,就可能陷入死胡同,后患无穷。如果一定要用,也要选择口碑好的。一些开源的项目,代码量大,框架结构复杂,驾驭不了,用之前也要三思。

     

    展开全文
  • 函数 rectangleOpencv 源码: void rectangle( InputOutputArray _img, Point pt1, Point pt2, const Scalar& color, int thickness, int lineType, int shift ) { Mat img
  • namespace cv has no member rectangle 请问opencv 3.3.0 的rectangle函数是什么形式的?
  • 关于Opencv中Rect和Rectangle函数

    万次阅读 2016-12-23 00:38:02
    1)构造函数 Rect(x,y,width,height),x, y 为左上角坐标, width, height 则为长和宽。 2)方法 contain(Point) 可返回改点是否在矩形内。 3)方法 inside(Rect) 可返回该矩形是否在矩形内。 4)交集 Rect=Rect1&...
  • Opencv3Rect和rectangle函数

    万次阅读 2018-06-04 10:16:10
    二、rectangle函数 void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); 简介:使用对角线的两点pt1,pt2画一个矩形...
  • opencv中rectangle 

    2021-04-25 19:40:41
    OpenCV函数rectangle绘矩形 rectangle( rook_image, Point( 0, 7*w/8.0 ), Point( w, w), Scalar( 0, 255, 255 ), -1, 8 ); 最后是函数:rectangle:rectangle <>(我们并没有为这家伙创建...
  • 使用opencv中detectMultiScale函数人脸检测问题及解决
  • 六、文字、line、rectangle、ellipse、circle、fillPoly 七、均值滤波、高斯滤波、中值滤波、双边滤波 八、dilate、erode、getStructuringElement 九、开操作、闭操作、形态学梯度、顶帽、黑帽 十、水平结构...
  • OpenCV中绘制函数目标· 学习使用OpenCV绘制不同的...代码 在上述所有函数中,您将看到如下所示的一些常见参数: img:要绘制形状的图像颜色:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)for b...
  • Opencv中有很多绘图参数,他们的函数定义如下: 基本绘图函数 1.1 画直线 void line ( InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_...
  • Opencv(Python版)-2 在OpenCV中绘制函数

    千次阅读 2019-02-10 22:09:53
    学习以下函数:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()等。 创建画板 # 创建一个黑色图像 img = np.zeros((512,512,3), np.uint8) 画线 # 画一条厚度为5...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,988
精华内容 4,395
关键字:

opencv中的rectangle函数