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

use*_*734 3 c++ opencv transformation matrix computer-vision

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

Mic*_*cka 6

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

因此,要将某些点从目标图像转换回源图像,请反转变换矩阵并使用结果转换这些点.要使用变换矩阵变换点,您可以将其从右侧乘以矩阵,然后可以进行去均匀化.

幸运的是,OpenCV不仅提供了warpAffine/warpPerspective方法,它们将一个图像的每个像素转换为另一个图像,但也有转换单个点的方法.

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

inputVectorstd::vector<cv::Point2f>(你也可以使用nx2或2xn矩阵,但有时这是错误的).相反,你可以使用cv :: Point3f类型,但我不确定那些是三维转换的同质坐标点还是3D点(或者两者都是?).

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

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


小智 6

这是一个 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
Run Code Online (Sandbox Code Playgroud)