如何验证rect是否在OpenCV中的cv::Mat内部

How to verify if rect is inside cv::Mat in OpenCV?

本文关键字:中的 OpenCV cv Mat 内部 是否 何验证 验证 rect      更新时间:2023-10-16

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

背景:在将对象检测为轮廓并尝试使用cv::boundingRect访问ROI后,我的应用程序崩溃了。好吧,这是因为靠近图像边界的对象的边界矩形可能不完全在图像内。

现在我跳过这个检查不完全在图像中的对象:

if(
  cellRect.x>0 && 
  cellRect.y>0 && 
  cellRect.x + cellRect.width < m.cols && 
  cellRect.x + cellRect.width < m.rows) ...

其中cellRect是对象的边界矩形,m为图像。我希望有一个专门的opencv功能。

简单的方法是使用AND(即&)运算符。

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

bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;

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

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

这里有一个判断矩形是否包含其他矩形的方法。您可以从cv::Mat first中获取尺寸信息,然后使用以下方法:

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;
}