Как проверить, находится ли rect внутри cv :: Mat в OpenCV?

Есть ли что-то вроде cv::Mat::contains(cv::Rect) в Opencv?

Фон: После обнаружения объектов в виде контуров и попытки доступа к областям интереса с помощью cv :: boundingRect мое приложение завершилось сбоем. Хорошо, это потому, что ограничительные участки объекта вблизи границы изображения могут быть не полностью внутри изображения.

Теперь я пропускаю объекты, которые не полностью в изображении, с помощью этой проверки:

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

где cellRect - ограничивающий прямоугольник объекта, а m - изображение. Я надеюсь, что для этого есть специальная функция opencv.

12 голосов | спросил Valentin Heinitz 18 MarpmWed, 18 Mar 2015 13:59:51 +03002015-03-18T13:59:51+03:0001 2015, 13:59:51

3 ответа


0

Простой способ - использовать оператор AND (т.е. & ) .

Предположим, вы хотите проверить, находится ли cv::Rect rect внутри cv::Mat mat:

bool is_inside = (rect & cv::Rect(0, 0, mat.cols, mat.rows)) == rect;
ответил herohuyongtao 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 01 Sep 2015 09:02:39 +0300 2015, 09:02:39
0

Вы можете создать прямоугольник, «представляющий» (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
ответил cyriel 18 MarpmWed, 18 Mar 2015 16:09:39 +03002015-03-18T16:09:39+03:0004 2015, 16:09:39
0

Вот метод для определения, содержит ли прямоугольник другой прямоугольник. Вы можете получить информацию о размере из 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;
}
ответил miko 9 J0000006Europe/Moscow 2017, 09:33:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132