C++ 如何撤消opencv中单个点的透视变换
我正在尝试使用反向透视图进行一些图像分析。我使用openCV函数getTransform和findHomography生成一个变换矩阵,并将其应用于源图像。这工作得很好,我能够从我想要的图像中得到点。问题是,我不知道如何获取各个点的值并撤消变换,以便将它们重新绘制到原始图片上。我只想撤消这组点的变换以找到它们的原始位置。如何做到这一点。 这些点的形状为openCV库中的点(x,y) 要反转单应(例如透视变换),通常只需反转变换矩阵即可 因此,要将一些点从目标图像转换回源图像,需要反转转换矩阵,并使用结果转换这些点。要使用变换矩阵变换点,可以将其从右到矩阵相乘,然后进行去均匀化 幸运的是,OpenCV不仅提供了warpAffine/warpPerspective方法(将一幅图像的每个像素转换为另一幅图像),而且还提供了转换单个点的方法 使用C++ 如何撤消opencv中单个点的透视变换,c++,opencv,matrix,computer-vision,transformation,C++,Opencv,Matrix,Computer Vision,Transformation,我正在尝试使用反向透视图进行一些图像分析。我使用openCV函数getTransform和findHomography生成一个变换矩阵,并将其应用于源图像。这工作得很好,我能够从我想要的图像中得到点。问题是,我不知道如何获取各个点的值并撤消变换,以便将它们重新绘制到原始图片上。我只想撤消这组点的变换以找到它们的原始位置。如何做到这一点。 这些点的形状为openCV库中的点(x,y) 要反转单应(例如透视变换),通常只需反转变换矩阵即可 因此,要将一些点从目标图像转换回源图像,需要反转转换矩阵,并
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感谢你的完美工作。我想我有点想过头了。如果你把它作为答案写下来,我会把它标对的。