扭曲图像的逆透视变换

时间:2015-10-06 13:44:07

标签: c++ opencv math perspectivecamera

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

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

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:0)

基本思路是你需要找到逆变换。在关联的问题中,他们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

请注意两个罪名的标志是相反的。

翻译的倒数只是相反方向的翻译。

       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 :(得分:0)

我还有一些问题需要对图像进行反向转换。 你需要存储点

function backupByExt {
  # $1 = extension $2 = searchPaths $3 = backPath
  ext=$1
  sp=$2
  bp=$3
  files=( "$sp" + *."$ext" )
  # printf 'Backing up %s files: %d\n' "$ext" "${#files[@]}"
  # loop over all the files having the current extension
  for f in "${files[@]}"
  do
    # printf 'File: %s bp: %s\n' "$f" "$bp"
    if [ "$f" != "*" ] && [ "$f" != "+" ] && [ "$f" != "./" ]; then
      cp "$f" "$bp"
    fi
  done
}

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