@ Iwillnotexist Idonotexist提出了他的图像透视变换代码(绕3轴旋转):link
我正在寻找一个函数(或数学)来进行逆透视变换。
让我们假设,我的“输入图像”是他的warpImage()
函数的结果,并且所有角度(theta,phi和gamma),scale和fovy也是已知的。
我正在寻找一个函数(或数学)来计算逆变换(黑色边框无关紧要)来获得主图像。
我该怎么做?
答案 0 :(得分:0)
基本思路是你需要找到逆变换。在关联的问题中,他们F = P T R1 R2
P
是投影转换,T
是翻译,R1
,R2
是两个轮换。
将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); 但是使用反向参数顺序(输出作为第一个参数,输入作为第二个参数)。 之后,一个简单的作物将摆脱所有的黑色。