Suite

Rectification d'image avec projection Mercator


J'ai écrit une fonction de rectification d'image qui permet à un utilisateur de sélectionner 2 points sur une image et 2 points sur une carte. La fonction rectifiera ensuite l'image afin qu'elle soit traduite, mise à l'échelle et tournée pour s'adapter aux deux points sur la carte.

Le code que j'ai écrit fonctionne parfaitement le long de l'équateur. Cependant, cette fonction « s'interrompt » lorsque vous vous déplacez plus au nord ou au sud. La rotation et l'échelle sont toutes les deux fausses. Je pense que c'est à cause de la projection de Mercator que j'utilise qui s'étend le long de l'axe de latitude.

Je ne sais pas comment procéder. Y a-t-il un peu de maths que je ne connais pas qui compensera l'étirement le long de la latitude ? Ou ai-je tort de supposer que c'est à cause de la projection de Mercator ?

Ci-dessous vous trouverez le code que j'utilise :

// transformFromPoints est un tableau avec les deux coordonnées sur l'image // Ils sont en lat long var fromPointA = this.transformFromPoints[0]; var fromPointB = this.transformFromPoints[1]; // transformToPoints est un tableau avec les deux coordonnées sur la carte // Ils sont en lat long var toPointA = this.transformToPoints[0]; var toPointB = this.transformToPoints[1]; // C'est l'img que nous voulons transformer var img = this.activeBaseMapImg; // Mettez d'abord l'ancre à jour pour que l'ancre soit exactement à partir du PointA // L'ancre définit le point autour duquel l'image sera dessinée // C'est aussi le point autour duquel l'image est tournée. var cornerPoints = img.getCornerPoints(); var xAnchorPos = M.Math.projectPointOnLine(fromPointA, cornerPoints[0], cornerPoints[1]); var yAnchorPos = M.Math.projectPointOnLine(fromPointA, cornerPoints[0], cornerPoints[3]); var xAnchorDir = M.Math.subVector2(xAnchorPos, cornerPoints[0]); var xLineDir = M.Math.subVector2(cornerPoints[1], cornerPoints[0]); var yAnchorDir = M.Math.subVector2(yAnchorPos, cornerPoints[0]); var yLineDir = M.Math.subVector2(cornerPoints[3], cornerPoints[0]); var xAnchor = xAnchorDir.x / xLineDir.x; var yAnchor = yAnchorDir.y / yLineDir.y; // Définir l'ancre à l'emplacement fromPointA img.setAnchor({x: xAnchor, y: yAnchor}); // Déplace l'image vers l'emplacement toPointA img.setPosition(toPointA); var fromDirection = M.Math.subVector2(fromPointB, fromPointA); var toDirection = M.Math.subVector2(toPointB, toPointA); // Détermine l'échelle var scale = toDirection.length() / fromDirection.length(); // Détermine la rotation var fromAngle = Math.atan2(fromDirection.y, fromDirection.x); var toAngle = Math.atan2(toDirection.y, toDirection.x); var angle = fromAngle - toAngle; // Effectuer une rotation et une mise à l'échelle img.setRotation(img.rotation + angle); img.setSize({largeur : img.size.width * échelle, hauteur : img.size.height * échelle});

Si vous avez besoin de plus d'informations pour aider à répondre à cette question, faites-le moi savoir.


Je pense que vous avez besoin d'un minimum de 3 points pour traduire, mettre à l'échelle et faire pivoter. La procédure et le code open source pour le faire sont expliqués ici : http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html Je suppose que vos images ne sont pas géoréférencées, donc cela ne devrait pas quelle que soit votre projection cartographique, car l'utilisateur n'a qu'à faire correspondre 3 points sur l'image à 3 coordonnées cartographiques.