2016-10-25 5 views
1

Я пишу функцию, которая оценивает, сколько пикселей перекрывается между двумя неизолированными трапециями. В моем приложении, трапеция всегда определяется как:Найти пересекающуюся область двух трапеций в OpenCV

typedef std::array<cv::Point, 4> Trapezoid; 
//[0] - bottom left 
//[1] - bottom right 
//[2] - top right 
//[3] - top left 

Кроме того, эти трапеции будут иметь свойства, что индексы [0] и [1] будет всегда иметь один и тот же Y, как будет [2] и [3] (Всегда параллельно оси Y).

Итак, допустим, у меня есть две трапеции:

//300 high, 100 top, 200 bottom 
Trapezoid trapezoid1{ cv::Point(100,400), cv::Point(300,400), cv::Point(250,100), cv::Point(150,100) }; 
//250 high, 50 top, 250 bottom 
Trapezoid trapezoid2{ cv::Point(75,400), cv::Point(325,400), cv::Point(225,150), cv::Point(175,150) }; 

Я мог бы итерацию по каждой строке одного из трапеций и сделать математику, чтобы выяснить, сколько пикселей в этой строке перекрытия:

uint32_t TrapezoidOverlap(const Trapezoid& trapezoid1, 
          const Trapezoid& trapezoid2) 
{ 
    //Count number of overlapping pixels 
    uint32_t overlappedpixels {0}; 

    for (int i = trapezoid1[3].y; i < trapezoid1[0].y; i++) { 
     overlappedpixels += //Math for overlapping pixels in X; 
    } 

    return overlappedpixels; 
} 

Первый и последний строки будут простыми, но все строки между ними потребуют тригонометрии, чтобы найти начальную и конечную точки обоих трапеций. Похоже, что это будет дорого стоить, и производительность в этом приложении имеет решающее значение. Я видел в this вопрос о том, что структуры Rect имеют оператор пересечения, однако я не уверен, есть ли какая-либо функция, которая поможет в этой ситуации.

Каким будет решение для достижения наилучших результатов в этой ситуации?

ответ

1

Нарисуйте трапеции или многоугольники с помощью CV_FILLED или в два матриксе и И них логически. Область пересечения:

int area_int = countNonZero(bitwise_and(TrapeZoidMatA,TrapeZoidMatB));

Я думаю, что это было бы очень эффективным в этом случае.

+1

Очень хорошее предложение, спасибо! Я думаю, по крайней мере, это сделает код самым простым. – DrTarr