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

C++ 如何撤消opencv中单个点的透视变换,c++,opencv,matrix,computer-vision,transformation,C++,Opencv,Matrix,Computer Vision,Transformation,我正在尝试使用反向透视图进行一些图像分析。我使用openCV函数getTransform和findHomography生成一个变换矩阵,并将其应用于源图像。这工作得很好,我能够从我想要的图像中得到点。问题是,我不知道如何获取各个点的值并撤消变换,以便将它们重新绘制到原始图片上。我只想撤消这组点的变换以找到它们的原始位置。如何做到这一点。 这些点的形状为openCV库中的点(x,y) 要反转单应(例如透视变换),通常只需反转变换矩阵即可 因此,要将一些点从目标图像转换回源图像,需要反转转换矩阵,并

我正在尝试使用反向透视图进行一些图像分析。我使用openCV函数getTransform和findHomography生成一个变换矩阵,并将其应用于源图像。这工作得很好,我能够从我想要的图像中得到点。问题是,我不知道如何获取各个点的值并撤消变换,以便将它们重新绘制到原始图片上。我只想撤消这组点的变换以找到它们的原始位置。如何做到这一点。 这些点的形状为openCV库中的点(x,y)

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

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

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

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

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

outputVector
是一个空的
std::vector
,用于存储结果


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

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

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

src–输入两通道或三通道浮点数组;每个元素都是要变换的2D/3D向量。 m–先前由
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)

转换后的点也将与输入数组的形状相同:点到被转换的点这里有一个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方法,但是如果它是透视变换,则不可能反转它。将三维点变换为二维点。从2D点知道的唯一一件事是,在3D中,它位于从摄影机到2D图像位置的直线上。线条上的位置不明确。正如@CoertMetz所说,通常你只需反转变换矩阵,并使用该逆矩阵以另一种方式变换点。@Mika我已尝试反转变换矩阵,我能够回到原始图像。问题是我只想找到我的4点的新位置。我不知道如何正确存储点以反转它们。如果我用手做反演,我会简单地把这个点做成一个向量,然后用反变换乘以它,得到新的点。但是,我试过了,它没有给我正确的位置。把
cv::Point2f
点放在
std::vector
中,然后使用
cv::perspectiveTransform(inputVector,emptyOutputVector,YourTransform)
@Mika感谢你的完美工作。我想我有点想过头了。如果你把它作为答案写下来,我会把它标对的。