• OpenCV图像处理——矩形(Rect)类的常用操作


    1.Rect类

    创建类

    Rect类成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高。

    创建一个Rect对象Rect,并在图像上画该矩形框。

    	cv::Rect rect(100, 50, 500, 500);
    	cv::Mat cv_src = cv::imread("11.JPG");
    	cv::rectangle(cv_src, rect, cv::Scalar(255, 0, 0),4);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", cv_src);
    
    	cv::waitKey(0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2. Rect常用参数

    cv::Rect rect(100, 50, 500, 500);
    
    rect.area();//面积
    rect.size();//大小
    rect.tl(); //左上角
    rect.br(); //右下角
    rect.size().width;//宽
    rect.size().height; //高
    
    std::cout << "rect area = " << rect.area() << ",rect size = " << rect.size()
    		<< ",rect tl = " << rect.tl() << ",rect br = " << rect.br() << ", rect width = "
    		<< rect.size().width << ",rect height = " << rect.size().height << std::endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出

    rect area = 250000,rect size = [500 x 500],rect tl = [100, 50],rect br = [600, 550], rect width = 500,rect height = 500
    
    • 1

    3. 常用判断

    3.1 判断点是否在矩形内,就是矩形是否包含这个点
    rect.contains(cv::Point(x, y)); 
    
    • 1
    3.2 判断对比两个矩形是否相等
    rect1 == rect2;
    rect1 != rect2;
    
    • 1
    • 2
    3.3 判断矩形是否包含另一个矩形
    bool isInside(cv::Rect& rect1, cv::Rect& rect2)
    {
    	if (rect1.area() > rect2.area())
    	{
    		return (rect1 == (rect1 & rect2));
    	}
    	else
    	{
    		return (rect2 == (rect2 & rect1));
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试调用代码

    	cv::Rect rect1(100, 50, 500, 500);
    
    	cv::Rect rect2(150, 100, 300, 300);
    
    	cv::Mat cv_src = cv::imread("11.JPG");
    	cv::rectangle(cv_src, rect1, cv::Scalar(255, 0, 0),4);
    	cv::rectangle(cv_src, rect2, cv::Scalar(255, 0, 255), 4);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", cv_src);
    
    	std::cout << isInside(rect1, rect2) << std::endl;
    
    	cv::waitKey(0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3.4 判断两个矩形是否相交

    当要判断两具矩形是否相交,就要考虑到,两个矩形如果相交几种可能性。
    在这里插入图片描述

    bool computRectJoinUnion(cv::Rect& r1, cv::Rect& r2)
    {
        if (r1.area() > r2.area())
        {
            if (r1.contains(r2.tl()) || r1.contains(r2.br()))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else if (r1.area() < r2.area())
        {
            if (r2.contains(r1.tl()) || r2.contains(r1.br()))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    4.矩形常用操作

    4.1 获取矩形矩形中心
    cv::Point getCenterPoint(cv::Rect& rect)
    {
    	cv::Point cpt;
    	cpt.x = rect.x + cvRound(rect.width/2.0);
    	cpt.y = rect.y + cvRound(rect.height/2.0);
    	return cpt;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4.2 缩放矩形
    //缩放矩形
    //缩放矩形
    cv::Rect rectScale(cv::Rect& rect, double scale_factor)
    {
    	int w_scale = (rect.width * scale_factor - rect.width)/2;
    	int h_scale = (rect.height * scale_factor - rect.height)/2;
    	cv::Rect new_rect;
    	new_rect.x = rect.x - w_scale;
    	new_rect.y = rect.y - h_scale;
    	new_rect.width = rect.width * scale_factor;
    	new_rect.height = rect.height * scale_factor;
    
    	return new_rect;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    awk用法:取列表最后一列
    【python】列表的使用
    毕业设计-深度学习机器视觉的交通标识符识别
    Kafka 认证二:ScramLoginModule 认证及 Java 连接测试
    从TCP到Socket,彻底理解网络编程是怎么回事
    linux平台编译运行c++程序
    【计算机视觉】Vision Transformers算法介绍合集(二)
    机器学习中的各种损失函数(L1,L2,smoothL1,交叉熵 )
    Anaconda常用操作(亲测有效果)
    解读随机生成密钥存文件的python代码
  • 原文地址:https://blog.csdn.net/matt45m/article/details/132474023