【OpenCV】Rect矩形类用法

本文详细介绍了OpenCV中Rect类的使用方法,包括如何获取矩形的面积、尺寸、顶点坐标等属性,以及如何进行矩形之间的交并运算、平移、缩放等操作。此外还提供了自定义函数来实现矩形内包判断及获取中心点。

原博客地址:http://blog.youkuaiyun.com/kh1445291129/article/details/51149849

在opencv\build\include\opencv2\core\types.hpp中可以查看详细的函数说明。

//如果创建一个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);
}
<think>嗯,用户问的是OpenCVRect的empty方法如何判断矩形是否为空。首先,我需要回忆一下OpenCVRect类的结构。Rect通常由x、y坐标和宽度、高度组成,也就是x, y, width, height。 那empty方法的判断逻辑应该是什么呢?可能和这些成员变量的值有关。比如,当宽度或高度小于等于零的时候,矩形可能就是空的。因为在图像处理中,宽度或高度为零或负数显然是没有实际意义的,这样的矩形区域无法表示有效的像素范围。 接下来需要验证一下这个猜想。查阅OpenCV的文档或者源代码可能会有帮助。根据之前的了解,OpenCVRect类确实有一个empty()方法,返回bool类型。其实现可能是检查width和height是否都大于0。或者可能还要考虑面积是否为正?不过通常来说,只要宽度或高度有一个小于等于零,矩形就无效。 比如,假设用户创建了一个Rect(0,0,0,10),这时候width是0,即使高度是正数,这个矩形实际上也是空的,因为宽度为零,无法构成有效的区域。同样,Rect(10,10,-5,20)这样的例子,宽度是负数,显然也是无效的。 所以,empty()方法的实现逻辑应该是判断width和height是否都大于零。如果其中任何一个小于等于零,就返回true,表示矩形为空;否则返回false。这可能就是OpenCV内部的处理方式。 外,用户可能想知道为什么这样设计。比如,当进行图像操作时,比如截取ROI区域,如果传入的矩形是无效的(比如width或height非正),可能会导致程序错误,因此empty方法可以帮助开发者提前检测这种情况,避免错误。 总结起来,Rect的empty方法通过检查宽度和高度是否都大于零来判断矩形是否有效。如果其中任何一个不满足,则视为空矩形。这样的逻辑简单有效,符合常见的编程习惯。</think>OpenCV中$cv::Rect$的`empty()`方法通过检测矩形尺寸的有效性来判断是否为空。其判断逻辑基于**宽度和高度是否为正值**,实现原理如下: ### 实现原理 1. **成员变量检查**:直接检测矩形的宽度(`width`)和高度(`height`) - 当`width <= 0` **或** `height <= 0`时返回`true` - 当`width > 0` **且** `height > 0`时返回`false` ```cpp bool empty() const { return width <= 0 || height <= 0; } ``` 2. **数学验证**:矩形有效性符合数学定义 - 有效矩形面积必须满足$S = width \times height > 0$ - 负值尺寸会导致面积计算异常 ### 使用示例 ```cpp cv::Rect valid_rect(10, 20, 30, 40); // 非空矩形 cv::Rect empty_rect(0, 0, -5, 100); // 空矩形(负宽度) cout << valid_rect.empty(); // 输出0(false) cout << empty_rect.empty(); // 输出1(true) ``` ### 注意事项 - **坐标位置不影响判断**:即使`x`或`y`为负数,只要尺寸有效仍视为非空 - **特殊边界情况**:当`width=0`且`height=0`时也视为空,即使坐标合法[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值