如何撤消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
我正在尝试使用逆透视图进行一些图像分析。我使用 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