Как можно легко определить, пересекаются ли 2 ОИ в OpenCv? - PullRequest
16 голосов
/ 03 января 2012

Я пытаюсь определить, пересекаются ли 2 области интереса (CvRect s) друг с другом в OpenCV. Очевидно, я могу вручную ввести несколько (или, скорее, много) условий для проверки, но это не очень хороший способ сделать это (imo).

Может кто-нибудь предложить мне другое решение? Есть ли готовый метод в OpenCV для этого?

Ответы [ 2 ]

30 голосов
/ 03 января 2012

Я не знаю ни одного готового решения для интерфейса C (CvRect), но если вы используете способ C ++ (cv::Rect), вы можете легко сказать

interesect  = r1 & r2;

Полный список операций над прямоугольниками равен

// In addition to the class members, the following operations 
// on rectangles are implemented:

// (shifting a rectangle by a certain offset)
// (expanding or shrinking a rectangle by a certain amount)
rect += point, rect -= point, rect += size, rect -= size (augmenting operations)
rect = rect1 & rect2 (rectangle intersection)
rect = rect1 | rect2 (minimum area rectangle containing rect2 and rect3 )
rect &= rect1, rect |= rect1 (and the corresponding augmenting operations)
rect == rect1, rect != rect1 (rectangle comparison)
5 голосов
/ 25 июня 2014
bool cv::overlapRoi(Point tl1, Point tl2, Size sz1, Size sz2, Rect &roi)
{
    int x_tl = max(tl1.x, tl2.x);
    int y_tl = max(tl1.y, tl2.y);
    int x_br = min(tl1.x + sz1.width, tl2.x + sz2.width);
    int y_br = min(tl1.y + sz1.height, tl2.y + sz2.height);
    if (x_tl < x_br && y_tl < y_br)
    {
        roi = Rect(x_tl, y_tl, x_br - x_tl, y_br - y_tl);
        return true;
    }
    return false;
}

Да.В OpenCV есть готовый метод для этого в opencv / modules / stitching / src / util.cpp

...