Solución:
Para invertir una homografía (por ejemplo, transformación de perspectiva), normalmente solo invierte la matriz de transformación.
Entonces, para transformar algunos puntos de su imagen de destino a su imagen de origen, invierte la matriz de transformación y transforma esos puntos con el resultado. Para transformar un punto con una matriz de transformación, lo multiplica de la derecha a la matriz, tal vez seguido de una deshomogeneización.
Afortunadamente, OpenCV proporciona no solo los métodos warpAffine / warpPerspective, que transforman cada píxel de una imagen en la otra imagen, sino que también existe un método para transformar puntos individuales.
Usar cv::perspectiveTransform(inputVector, emptyOutputVector, yourTransformation)
método para transformar un conjunto de puntos, donde
inputVector
es un std::vector<cv::Point2f>
(también puede usar una matriz nx2 o 2xn, pero a veces eso es erróneo). En su lugar, puede usar el tipo cv :: Point3f, pero no estoy seguro de si serían puntos de coordenadas homogéneos o puntos 3D para transformación 3D (¿o quizás ambos?).
outputVector
es un vacio std::vector<cv::Point2f>
donde se almacenará el resultado
yourTransformation
es un cv :: Mat 3×3 de doble precisión (como lo proporciona findHomography
) matriz de transformación (o 4×4 para puntos 3D).
Aquí hay un ejemplo de Python:
import cv2
import numpy as np
# Forward transform
point_transformed = cv2.perspectiveTransform(point_original, trans)
# Reverse transform
inv_trans = np.linalg.pinv(trans)
round_tripped = cv2.perspectiveTransform(point_transformed, inv_trans)
# Now, round_tripped should be approximately equal to point_original