Trouver la zone de intersection de deux trapèzes dans OpenCV

J’écris une fonction qui évalue le nombre de pixels qui se chevauchent entre deux trapèzes non isocèles. Dans ma demande, un trapèze est toujours défini comme:

typedef std::array Trapezoid; //[0] - bottom left //[1] - bottom right //[2] - top right //[3] - top left 

De plus, ces trapèzes auront les propriétés que les index [0] et [1] auront toujours le même Y que les [2] et [3] (toujours parallèle à l’axe des Y).

Donc, disons que j’ai deux trapèzes:

 //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) }; 

Je pourrais parcourir chaque ligne d’un des trapèzes et faire le calcul pour déterminer le nombre de pixels de cette ligne qui se chevauchent:

 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; } 

La première et la dernière rangée seront simples, mais toutes les rangées intermédiaires nécessiteront une sortinggonomésortinge pour trouver les points de début et de fin des deux trapèzes. Cela semble coûteux en calcul et les performances sont essentielles dans cette application. J’ai vu dans cette question que les structures Rect ont un opérateur d’intersection, mais je ne suis pas sûr qu’il existe une fonction qui aiderait dans cette situation.

Quelle serait la solution pour une meilleure performance dans cette situation?

Dessinez les trapèzes ou les polygones à l’aide de CV_FILLED ou de fillPoly dans deux masortingces et ET logiquement. La zone d’intersection est:

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

Je pense que cela serait très efficace dans ce cas.