【问题标题】:Inverse perspective transformation of a warped image扭曲图像的反透视变换
【发布时间】:2015-10-06 13:44:06
【问题描述】:

@ Iwillnotexist Idonotexist 展示了他的图像透视变换代码(绕 3 轴旋转):link

我正在寻找一个函数(或数学)来进行逆透视变换。

让我们假设,我的“输入图像”是他的warpImage() 函数的结果,并且所有角度(theta、phi 和 gamma)、比例和 fovy 也是已知的。

我正在寻找一个函数(或数学)来计算逆变换(黑色边框无关紧要)以获得主图像。

我该怎么做?

【问题讨论】:

    标签: c++ opencv math perspectivecamera


    【解决方案1】:

    基本思想是你需要找到逆变换。在链接的问题中,他们有F = P T R1 R2,其中P 是射影变换,T 是平移,R1R2 是两个旋转。

    F* 表示为逆变换。我们可以将其反转为F* = R2* R1* T* P*。注意顺序变化。其中三个很容易R1* 只是另一个旋转,但角度被否定。所以第一个反向旋转将是

            cos th    sin th    0    0
    R1* =  -sin th    cos th    0    0
                0        0      1    0
                0               0    1
    

    注意这两个 sin 项上的符号是相反的。

    翻译的逆向只是相反方向的翻译。

           1       0      0      0
    T*=    0       1      0      0
           0       0      1      h
           0       0      0      1
    

    您可以检查这些计算 T* T 应该是单位矩阵。

    最棘手的一点是我们拥有的投影分量

          cot(fv/2)    0             0               0
      P =   0       cot(fv/2)        0               0
            0           0      -(f+n)/(f-n)   -2 f n / (f-n) 
            0           0           -1               0
    

    与此相反的是

          tan(fv/2)    0             0               0
      P*=   0       tan(fv/2)        0               0
            0           0            0              -2 
            0           0        (n-f)/(f n)    (f+n)/(f n)
    

    Wolfram alpha inverse with v=fv

    然后您需要将它们以相反的顺序相乘以获得最终矩阵。

    【讨论】:

    • 非常感谢,但是......它不起作用......我按照你写的做了一切,但不幸的是它只适用于围绕第一个轴的旋转(“垂直于屏幕”) .当我尝试围绕其他两个轴中的任何一个旋转输入图像(即使是 1 度)时,结果图像是空的...我计算逆矩阵 R1、R2、R3(我将 sinus 更改为 -sinus)、T(我更改了-h 到 h) 和 P 就像你写的那样......也许我不明白你(和 Wolfram Alpha 中的)例子中的“fv”和“v”是什么......?
    • 啊有一个错字。它应该是 f n 而不是 f v。我已经修改了我的答案,并没有注明 Wolfram 链接。
    • 谢谢,但是......仍然什么都没有......我认为,这也应该是“2 * f * n”而不是 P(3,2) 中分母中的“f * n”和 P(3,3),不是吗?但不管怎样,变换后的图像有点奇怪......整个图像是灰色的 - 当我变换棋盘图像时,变换后图像中的每个像素都有值 128,所以看起来它是平均值......我不知道,我做错了什么......如果你或有人能看看我的代码,那就太好了,但我不确定我可以把它放在哪里......(太少了此评论块中的空间)...
    【解决方案2】:

    我也遇到了对图像进行反向转换的问题。 您需要存储积分

    ptsInPt2f   and   ptsOutPt2f
    

    在“warpMatrix”方法中计算。 要进行反向转换,只需使用相同的方法 M = getPerspectiveTransform(ptsOutPt2f, ptsInPt2f); 但使用相反的参数顺序(输出作为第一个参数,输入作为第二个)。 之后,一个简单的作物将摆脱所有的黑色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 2015-11-22
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多