【问题标题】:Projective transformation fitting投影变换拟合
【发布时间】:2010-12-23 17:03:08
【问题描述】:

给定 3D 点集( X = (x1, x2, x3), Y = (y1, y2, y3) ),我如何拟合从 X 到 Y 的转换?

据我所知,这称为投影变换。
这是 X 和 Y 的示例。

X 中的蓝线和红线平行,但 Y 中不平行。

【问题讨论】:

标签: algorithm math


【解决方案1】:

3d 中的投影变换具有关联的 4x4 矩阵(模常数乘法)。你可以找到最小二乘拟合的矩阵。

【讨论】:

  • 是的,我们知道,但不是很有帮助
【解决方案2】:

嗯。我发现了一些有用的信息:

这种变换是非线性的,不可能用矩阵来表示非线性变换。有一些技巧,例如使用齐次坐标。但它并没有使所有非线性变换都可以使用矩阵来表示。 但是,用线性函数逼近非线性函数是可能的。

【讨论】:

  • 变换是投影的。投影变换用定义为乘法常数的矩阵表示。
【解决方案3】:

所以,任务是找到最合适的linear transformation,对吧?

有一个使用线性回归的简单解决方案。

假设转换矩阵名为A,尺寸为 3x3。假设你在转换前后有N 3D 向量(点) - 所以你有 3 行 N 列的矩阵 X 和 Y。那么变换就是:

Y = A X + B

其中 B 是长度为 3 的向量并指定移位。您可以使用索引重写矩阵乘法:

y[i,j] = sum(k=1..3)(a[i,k] * x[k,j])  + b[i]

对于 i = 1..3 和 j = 1 .. N。因此,您有 12 个未知变量(a、b)和 3 * N 个方程。对于 N >= 4,您只需使用线性回归找到最佳解决方案。

例如,在 R 中很容易:

# input data
X = matrix(c(c(0, 0, 0), c(1, 0, 0), c(0, 1, 0), c(0, 1, 1)), nrow = 3)
Y = matrix(c(c(1, 0, 1), c(2, 0, 1), c(1, 1, 1), c(1, 1, 2)), nrow = 3)
# expected transformation: A is identity matrix, b is [1, 0, 1]
N = dim(Y)[2]

# transform data for regression
a1 = rbind(t(X), matrix(rep(0, 3*2*N), ncol = 3))
a2 = rbind(matrix(rep(0, 3*N), ncol = 3), t(X), matrix(rep(0, 3*N), ncol = 3))
a3 = rbind(matrix(rep(0, 3*2*N), ncol = 3), t(X))
b1 = rep(1:0, c(N, 2*N))
b2 = rep(c(0, 1, 0), each = N)
b3 = rep(0:1, c(2*N, N))
y = as.vector(t(Y))

# do the regression
summary(lm(y ~ 0 + a1 + a2 + a3 + b1 + b2 + b3))

输出是:

[...]

Coefficients:
      Estimate Std. Error t value Pr(>|t|)
a11  1.000e+00         NA      NA       NA
a12 -2.220e-16         NA      NA       NA
a13 -3.612e-32         NA      NA       NA
a21  7.850e-17         NA      NA       NA
a22  1.000e+00         NA      NA       NA
a23 -1.743e-32         NA      NA       NA
a31  0.000e+00         NA      NA       NA
a32  0.000e+00         NA      NA       NA
a33  1.000e+00         NA      NA       NA
b1   1.000e+00         NA      NA       NA
b2  -7.850e-17         NA      NA       NA
b3   1.000e+00         NA      NA       NA

Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared:     1,      Adjusted R-squared:   NaN 
F-statistic:   NaN on 12 and 0 DF,  p-value: NA 

正如预期的那样。

【讨论】:

  • 非线性变换。投影变换。但这应该很容易适应(投影变换大致是 4x4 矩阵,其条目总和为 1)。
  • OP 的要求确实是投影,但线性投影会满足我。恐怕我对 R 不熟悉。你能提供我可以翻译成 C# 或 VB.Net 的代码(必要时使用 EMGU+OpenCV)吗?谢谢。
  • @smirkingman,只需使用任何线性回归库来估计矩阵 A 和 B 作为参数,正如我上面所描绘的(可能使用带有索引的第二个方程)。或者,如果您没有找到任何 C# 库,您可以interface R from C#,或者查看线性回归的工作原理并编写您自己的参数估计表达式。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多