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

Val*_*itz 14 c++ opencv

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

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

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

if(
  cellRect.x>0 && 
  cellRect.y>0 && 
  cellRect.x + cellRect.width < m.cols && 
  cellRect.x + cellRect.width < m.rows) ...
Run Code Online (Sandbox Code Playgroud)

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

her*_*tao 25

简单的方法是使用AND(ie &)运算符.

假设您要检查是否cv::Rect rect在里面cv::Mat mat:

bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
Run Code Online (Sandbox Code Playgroud)

  • @ValentinHeinitz不是一个新的`Mat`,实际上是一个新的`Rect`,它基本上只是4个数字`(x,y,width,height)`.所以它应该相对较快.:P (2认同)

cyr*_*iel 5

您可以创建矩形"表示"(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
Run Code Online (Sandbox Code Playgroud)

  • 我认为没有这样的功能,因为一个rect可以包含100%的其他rect,完全不包含(0%)或0-100%之间的任何部分.如果你想检查rect1是否完全包含rect2,只需使用这个代码`bool contains =(rect1&rect2).area()== rect2.area()`.请注意,如果rect2.area()为0(因此宽度或高度将等于0),此代码将返回true,如果您不想这样,请使用以下代码:`bool contains = rect2.area()&&( rect1&rect2).area()== rect2.area()`.希望这是你需要的:) (3认同)