Scaramuzza 的鱼眼相机模型投影
Projection of fisheye camera model by Scaramuzza
我正在尝试理解在 Matlab 中实现的 Scaramuzza 的鱼眼模型,请参阅 https://de.mathworks.com/help/vision/ug/fisheye-calibration-basics.html#mw_8aca38cc-44de-4a26-a5bc-10fb312ae3c5
根据以下等式,反投影(uv 到 xyz)似乎相当简单:
, 其中 rho=sqrt(u^2 +v^2)
但是,投影(从 xyz 到 uv)是如何工作的?!根据我的理解,我们得到了一组相当复杂的方程式。不幸的是,我没有找到任何详细信息....
好的,我相信在分析了Scaramuzza的(windows)校准工具箱的功能后,我现在已经完全理解了,参见https://sites.google.com/site/scarabotix/ocamcalib-toolbox/ocamcalib-toolbox-download-page
在文件 "world2cam.m"
中找到方法 1
对于投影,使用上面相同的等式。在投影情况下,方程具有三个已知变量 (x,y,z) 和三个未知变量(u,v 和 lambda)。我们首先通过意识到
用 rho 替换 lambda
u = x/lambda
v = y/lambda
rho=sqrt(u^2+v^2) = 1/lambda * sqrt(x^2+y^2) --> lambda = sqrt(x^2+y^2) / rho
之后,我们有未知变量(u、v 和 rho)
u = x/lambda = x / sqrt(x^2+y^2) * rho
v = y/lambda = y / sqrt(x^2+y^2) * rho
z / lambda = z /sqrt(x^2+y^2) * rho = a0 + a2*rho^2 + a3*rho^3 + a4*rho^4
如您所见,最后一个方程现在只有一个未知数,即 rho。因此,我们可以使用例如轻松解决它matlab中的根函数。然而,结果并不总是存在,也不一定是唯一的。求解完未知变量rho,利用上面的方程计算uv就很简单了
此过程需要分别对每个点 (x,y,z) 执行,因此对于图像来说计算量很大。
在文件 "world2cam_fast.m"
中找到方法 2
最后一个方程的形式为 rho(x,y,z)。但是,如果我们定义 m = z / sqrt(x^2+y^2) = tan(90°-theta),它只取决于一个变量,即 rho(m)。
作者没有为每个新的 m 求解这个方程 rho(m),而是 "plot" 几个 m 值的函数,并用一个 8 阶多项式拟合这些点。使用这个多项式,他们可以在下面更快地计算出 rho(m) 的近似值。
这变得很清楚,因为 "world2cam_fast.m" 使用了 ocam_model.pol,它是在 "undistort.m" 中计算的。 "undistort.m" 又利用了 "findinvpoly.m".
我正在尝试理解在 Matlab 中实现的 Scaramuzza 的鱼眼模型,请参阅 https://de.mathworks.com/help/vision/ug/fisheye-calibration-basics.html#mw_8aca38cc-44de-4a26-a5bc-10fb312ae3c5
根据以下等式,反投影(uv 到 xyz)似乎相当简单:
但是,投影(从 xyz 到 uv)是如何工作的?!根据我的理解,我们得到了一组相当复杂的方程式。不幸的是,我没有找到任何详细信息....
好的,我相信在分析了Scaramuzza的(windows)校准工具箱的功能后,我现在已经完全理解了,参见https://sites.google.com/site/scarabotix/ocamcalib-toolbox/ocamcalib-toolbox-download-page
在文件 "world2cam.m"
中找到方法 1对于投影,使用上面相同的等式。在投影情况下,方程具有三个已知变量 (x,y,z) 和三个未知变量(u,v 和 lambda)。我们首先通过意识到
用 rho 替换 lambdau = x/lambda
v = y/lambda
rho=sqrt(u^2+v^2) = 1/lambda * sqrt(x^2+y^2) --> lambda = sqrt(x^2+y^2) / rho
之后,我们有未知变量(u、v 和 rho)
u = x/lambda = x / sqrt(x^2+y^2) * rho
v = y/lambda = y / sqrt(x^2+y^2) * rho
z / lambda = z /sqrt(x^2+y^2) * rho = a0 + a2*rho^2 + a3*rho^3 + a4*rho^4
如您所见,最后一个方程现在只有一个未知数,即 rho。因此,我们可以使用例如轻松解决它matlab中的根函数。然而,结果并不总是存在,也不一定是唯一的。求解完未知变量rho,利用上面的方程计算uv就很简单了
此过程需要分别对每个点 (x,y,z) 执行,因此对于图像来说计算量很大。
在文件 "world2cam_fast.m"
中找到方法 2最后一个方程的形式为 rho(x,y,z)。但是,如果我们定义 m = z / sqrt(x^2+y^2) = tan(90°-theta),它只取决于一个变量,即 rho(m)。
作者没有为每个新的 m 求解这个方程 rho(m),而是 "plot" 几个 m 值的函数,并用一个 8 阶多项式拟合这些点。使用这个多项式,他们可以在下面更快地计算出 rho(m) 的近似值。
这变得很清楚,因为 "world2cam_fast.m" 使用了 ocam_model.pol,它是在 "undistort.m" 中计算的。 "undistort.m" 又利用了 "findinvpoly.m".