首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OpenCV中验证rect是否在cv::Mat中?

如何在OpenCV中验证rect是否在cv::Mat中?
EN

Stack Overflow用户
提问于 2015-03-18 10:59:51
回答 3查看 13.4K关注 0票数 16

在Opencv中有类似cv::Mat::contains(cv::Rect)的东西吗?

背景:在检测对象为轮廓并尝试使用cv::访问ROIs之后,应用程序崩溃了。好的,那是因为靠近图像边框的物体的边框可能不完全在图像中。

现在,通过下面的检查,我跳过了不完全在图像中的对象:

代码语言:javascript
复制
if(
  cellRect.x>0 && 
  cellRect.y>0 && 
  cellRect.x + cellRect.width < m.cols && 
  cellRect.x + cellRect.width < m.rows) ...

其中cellRect是物体的边界,m是图像。我希望有一个专门的opencv功能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-01 06:02:39

简单的方法是使用(即操作符)。

假设您想检查cv::Rect rect是否在cv::Mat mat

代码语言:javascript
复制
bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
票数 29
EN

Stack Overflow用户

发布于 2015-03-18 13:09:39

您可以创建rect“表示”(x,y= 0,宽度和高度等于图像的宽度和高度)图像,并检查它是否包含轮廓的边框。要实现这一点,您需要使用rect交集--在OpenCV中非常简单,只需使用rect1 & rect2。希望该守则明确指出:

代码语言:javascript
复制
cv::Rect imgRect = cv::Rect(cv::Point(0,0), img.size());
cv::Rect objectBoundingRect = ....;
cv::Rect rectsIntersecion = imgRect & objectBoundingRect;
if (rectsIntersecion.area() == 0)
  //object is completely outside image
else if (rectsIntersecion.area() == objectBoundingRect.area()) 
  //whole object is inside image
else 
  //((double)rectsIntersecion.area())/((double)objectBoundingRect.area()) * 100.0 % of object is inside image
票数 5
EN

Stack Overflow用户

发布于 2017-06-09 06:33:21

下面是一种判断矩形是否包含其他矩形的方法。您可以从cv::Mat first获取大小信息,然后使用下面的方法:

代码语言:javascript
复制
public bool rectContainsRect(Rectangle containerRect, Rectangle subRect)
{
    if( containerRect.Contains(new Point(subRect.Left, subRect.Top)) 
        && containerRect.Contains(new Point(subRect.Right, subRect.Top))
        && containerRect.Contains(new Point(subRect.Left, subRect.Bottom))
        && containerRect.Contains(new Point(subRect.Right, subRect.Bottom)))
    {
        return true;
    }
    return false;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29120231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档