[EDITÉ] Voici comment c'est fait.
Étapes: 1. Isolez la pièce Road Divider.
Ensuite, à l'aide de Houghlines, recherchez les lignes les plus longues dans Image. Découvrez les points d'extrema qui traversent la frontière de l'image. Vous avez obtenu les points quadilatéraux. J'ai sauté cette partie en les choisissant manuellement. Dans mon cas, la largeur de la route en haut de l'image est de 10 et en bas de 60.
Maintenant, pour la destination, nous devons Image afin que le diviseur quadilatéral ait une largeur uniforme de 60, donc nous enregistrons dans un autre tableau de nouveaux points, qui ont les mêmes points inférieurs, mais les points supérieurs sont modifiés car ils forment un rectangle avec une hauteur identique à l'image (ou plus grand, vous pouvez ajuster comme il vous convient après l'avoir exécuté une fois et voir les résultats), mais largeur 60. N'oubliez pas, nous transformons notre image de telle sorte que le séparateur s'insère dans cette zone rectangulaire. L'image changera automatiquement.
Maintenant, en utilisant
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
d'ouverture sur les points quadilatéraux initiaux et de destination, nous obtenons une matrice de transformation que nous appliquons à notre image de test.
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
Vous verrez que beaucoup de zones sont recadrées pour s'adapter à la sortie dans la taille de l'image d'entrée. Cependant, vous remarquerez que l'image est transformée pour obtenir un diviseur parallèle, comme nous l'espérions. En effectuant des traductions et des trucs et en prenant une image de sortie de plus grande taille, vous obtiendrez cela. Nous ne pouvons jamais obtenir une image de sortie parfaitement enveloppée, car sa taille peut être très grande. Mais nous atteindrons une contrainte qui remplira notre tâche. Voici la dernière image: