【问题标题】:How to undo a perspective transform for a single point in opencv如何撤消opencv中单点的透视变换
【发布时间】:2015-06-30 20:01:30
【问题描述】:

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

【问题讨论】:

  • 我不知道 OpenCV 方法,但如果是透视变换,则无法反转它。您将 3D 点转换为 2D 点。您从 2D 点唯一知道的是,在 3D 中,它位于从相机到 2D 图像位置的直线上。线上的位置不明确。
  • 正如@CoertMetz 所说,通常您只需反转变换矩阵并使用该逆矩阵来变换点。
  • @Micka 我已经尝试反转变换矩阵,我能够回到原始图像。问题是我只想找到我的 4 个点的新位置。我不确定如何正确存储点以反转它们。如果我手动进行反演,我只需将该点设为向量并将其与逆变换相乘即可得到新点。但是,我已经尝试过了,但它没有给我正确的位置。
  • cv::Point2f 点放入std::vector<cv::Point2f>,然后使用cv::perspectiveTransform(inputVector, emptyOutputVector, yourTransformation)
  • @Micka 感谢完美的工作。我想我有点想多了。如果你把它写成答案,我会把它标记为正确的。

标签: c++ opencv matrix computer-vision transformation


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      src – 输入两通道或三通道浮点数组;每个元素都是要转换的 2D/3D 向量。 m – 之前由cv2.getPerspectiveTransform(_src, _dst) 计算的 3x3 或 4x4 浮点变换矩阵

      在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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        相关资源
        最近更新 更多