如何在 OpenCV 中验证 rect 是否在 cv::Mat 内?
How to verify if rect is inside cv::Mat in OpenCV?
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功能。
您可以创建 rect "representing"(x,y = 0, width and height equal to image width and height) 您的图像并检查它是否包含轮廓的边界矩形。为此,您需要使用矩形交集——在 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
简单的方法是使用 AND(即 &
)运算符。
假设您要检查 cv::Rect rect
是否在 cv::Mat mat
中:
bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
这里有一个判断一个矩形是否包含另一个矩形的方法。
您可以从 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;
}
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功能。
您可以创建 rect "representing"(x,y = 0, width and height equal to image width and height) 您的图像并检查它是否包含轮廓的边界矩形。为此,您需要使用矩形交集——在 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
简单的方法是使用 AND(即 &
)运算符。
假设您要检查 cv::Rect rect
是否在 cv::Mat mat
中:
bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
这里有一个判断一个矩形是否包含另一个矩形的方法。
您可以从 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;
}