图像配准b样条opencv

Image registration b-spline opencv

这是我的问题: 我的光学系统由一个相机加上一个圆形有机玻璃 "lens" 组成,该有机玻璃会根据压力(径向弯曲)改变其曲率。

这种曲率会导致相机拍摄的图像发生变形。 要纠正这种变形,需要校准图像。 可以用网格(棋盘、点、线)进行校准,压力范围必须用一定的步骤离散化。 对于每个压力步骤,必须拍摄网格图像。 然后必须将每个图像与参考图像 (P=0) 进行比较,并且必须计算和存储变换矩阵。 最后,在特定压力实验期间拍摄的每张图像都必须通过变换矩阵进行校正。

变形是非线性的(不仅是旋转和平移的组合),而且很可能是桶形变形。 (同样不是由相机引起的) 看起来像这样: http://en.wikipedia.org/wiki/Distortion_%28optics%29#mediaviewer/File:Barrel_distortion.svg

我在 ImageJ 中找到了一个名为 BunwarpJ 的插件,http://biocomp.cnb.csic.es/~iarganda/bUnwarpJ/

我基本上想知道在 Opencv 中是否有等效的方法来产生相同的结果。 (CalibrateCamera 不会解决问题)

OpenCv 有一个 undistort function 可以拍摄当前图像,相机系数矩阵,畸变系数。并生成针对发送的相机系数校正的新图像。和一组新的相机系数。 (如果您需要对新图像进行其他转换)。

我之前没有用过,所以我不能说相机或畸变系数到底是什么,但如手册所述:

The function transforms an image to compensate radial and tangential lens distortion. The function is simply a combination of initUndistortRectifyMap() (with unity R ) and remap() (with bilinear interpolation).

所以检查这两个函数。 out 是找出答案的好方法。

我相信您可能误解了手册,因为您似乎认为 CalibrateCamera does this for you. Instead CalibrateCamera 实际上 returns 相机和失真系数。您需要 undistort 您的图片。

每个镜头都有自己的 常数 系数。在您的情况下,这意味着您必须 calibrateCamera 一系列压力(我假设您通过实验控制它?),然后调用不同的 undistort func。使用不同的参数,您将从实验中得到这些参数。

矩阵只能捕获线性变换(或者可能是齐次space中的线性变换),不能捕获一般的失真。

根据我的经验,任何使用单一全局转换公式的尝试都不会非常准确(仅获得 99.9% 的准确度并非微不足道)。如果您想要高精度,即使仅以这种方式校正相机镜头畸变也很困难。

过去我使用稀疏全局 RBF 插值得到了足够好的结果,但后来我转向了插值 2d 样条方法;如果您可以选择在规则网格上设置校准点,这就是我建议的解决方案。

最终映射可以是规则网格上的 2 值 3d 插值样条(图像的 XY,压力的 Z;值 UV 是像素坐标)。

已知压力后拉直图像就是纹理贴图。