Ответ 1
Простым способом является использование оператора И (т.е. &
).
Предположим, что вы хотите проверить, находится ли cv::Rect rect
внутри cv::Mat mat
:
bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
Есть ли что-то вроде cv::Mat::contains(cv::Rect)
в Opencv?
Фон: После обнаружения объектов как контуров и попыток доступа к ROI с помощью cv:: boundingRect мое приложение разбилось. Хорошо, это потому, что ограничивающие прямоугольники объекта, близкие к границе изображения, могут быть не полностью внутри изображения.
Теперь я пропускаю объекты не полностью по изображению с помощью этой проверки:
if(
cellRect.x>0 &&
cellRect.y>0 &&
cellRect.x + cellRect.width < m.cols &&
cellRect.x + cellRect.width < m.rows) ...
где cellRect является ограничивающим прямоугольником объекта, а m - изображением. Надеюсь, для этого есть специальная функция opencv.
Простым способом является использование оператора И (т.е. &
).
Предположим, что вы хотите проверить, находится ли cv::Rect rect
внутри cv::Mat mat
:
bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
Вы можете создать прямоугольник "представляющий" (x, y = 0, ширину и высоту, равный ширине и высоте изображения) вашего изображения и проверить, содержит ли он ограничивающие прямоугольники ваших контуров. Для этого вам нужно использовать прямоугольное пересечение - в 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;
}