如何撤消opencv中单个点的透视变换

How to undo a perspective transform for a single point in opencv

我正在尝试使用逆透视图进行一些图像分析。我使用 openCV 函数 getTransform 和 findHomography 生成变换矩阵并将其应用于源图像。这很好用,我可以从我想要的图像中得到分数。问题是,我不知道如何获取单个点值并撤消转换以将它们绘制回原始图片。我只想撤消这组点的变换以找到它们的原始位置。如何做到这一点。 这些点采用 OpenCV 库中的 Point(x,y) 形式。

要反转单应性(例如透视变换),您通常只需反转变换矩阵。

因此,要将一些点从目标图像转换回源图像,您需要反转转换矩阵并使用结果转换这些点。要使用变换矩阵变换一个点,您可以将它从右乘到矩阵,然后可能会进行去均质化。

幸运的是,OpenCV 不仅提供 warpAffine/warpPerspective 方法,将一幅图像的每个像素转换为另一幅图像,而且还提供了转换单个点的方法。

使用cv::perspectiveTransform(inputVector, emptyOutputVector, yourTransformation)方法变换一组点,其中

inputVector 是一个 std::vector<cv::Point2f>(您也可以使用 nx2 或 2xn 矩阵,但有时这是错误的)。相反,您可以使用 cv::Point3f 类型,但我不确定这些是齐次坐标点还是用于 3D 转换的 3D 点(或者两者都是?)。

outputVector 是一个空的 std::vector<cv::Point2f> 将存储结果

yourTransformation 是双精度 3x3 cv::Mat(如 findHomography 提供的)转换矩阵(或 4x4 用于 3D 点)。

您可以使用cv::perspectiveTransform(inputVector, emptyOutputVector, yourTransformation)对点应用透视变换

Python: cv2.perspectiveTransform(src, m) → dst

src – 输入two-channel或three-channelfloating-point数组;每个元素都是要转换的 2D/3D 矢量。 m – 3x3 或 4x4 floating-point 先前由 cv2.getPerspectiveTransform(_src, _dst)

计算的变换矩阵

在python中,你必须在一个numpy数组中传递点,如下所示:

points_to_be_transformed = np.array([[[0, 0]]], dtype=np.float32)
transfromed_points = cv2.perspectiveTransform(points_to_be_transformed, m)

transfromed_points 也将与输入数组具有相同的形状:points_to_be_transformed

这是一个 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