Я пишу функцию, которая оценивает, сколько пикселей перекрывается между двумя неизолированными трапециями. В моем приложении, трапеция всегда определяется как:Найти пересекающуюся область двух трапеций в 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 имеют оператор пересечения, однако я не уверен, есть ли какая-либо функция, которая поможет в этой ситуации.
Каким будет решение для достижения наилучших результатов в этой ситуации?
Очень хорошее предложение, спасибо! Я думаю, по крайней мере, это сделает код самым простым. – DrTarr