这是我的问题:我的光学系统是由一个照相机和一个圆形有机玻璃“透镜”组成的,它根据压力(径向弯曲)改变其曲率。
这种曲率会导致摄像机捕捉到的图像发生变形。为了纠正这种变形,需要对图像进行校准。校准可以用栅格(棋盘、点、线)进行,压力范围必须用一定的步骤来离散。对于每个压力步骤,必须拍摄网格的图像。然后,必须将每幅图像与参考图像(P=0)进行比较,并计算和存储转换矩阵。最后,在实验过程中拍摄到的每一张特定压力的图像都需要通过变换矩阵进行校正。
变形是非线性的(不仅是旋转和平移的组合),而且很可能是桶形变形。(同样不是由摄像机诱导)看起来是这样的:distortion.svg
我在ImageJ中找到了一个名为BunwarpJ,http://biocomp.cnb.csic.es/~iarganda/bUnwarpJ/的插件
我基本上想知道在Opencv中是否有同样的方法来产生同样的结果。(CalibrateCamera做不到这一点)
发布于 2015-02-27 18:05:25
OpenCv有一个可以接收当前图像、摄像机系数矩阵、畸变系数的函数。并产生一个新的图像校正为发送的相机系数。和一套新的摄像机。(如果需要对新映像进行其他转换)。
我以前没有使用过它,所以我不能说相机或变形系数到底是什么,但正如手册所描述的:
该函数转换图像以补偿径向和切向透镜的畸变。函数只是initUndistortRectifyMap() (具有单位R)和remap() (双线性插值)的组合。
所以检查一下这两个功能。找出是个很好的方法。
我相信您误解了手册,也许是因为您似乎认为CalibrateCamera是为您做的。相反,CalibrateCamera实际上返回相机和扭曲系数。这是你需要undistort你的形象。
每个透镜都有自己的常数系数。在你的例子中,这意味着你必须在一定的压力范围内进行calibrateCamera (我假设你在实验上控制了这一点?)然后调用不同的undistort func。你会从实验中得到不同的参数。
发布于 2015-02-27 18:40:52
矩阵只能捕捉线性变换(或者可能是齐次空间中的线性变换),而不是一般的失真。
在我的经验中,任何试图使用单一全局转换公式的尝试都不会非常准确(仅获得99.9%的准确性并不简单)。如果你想要高精度的话,即使仅仅用这种方法校正镜头畸变也是很困难的。
在过去,我使用稀疏的全局RBF插值得到了足够好的结果,但后来我转向了插值的2d样条方法;如果你可以选择你的校准点在一个规则的网格上,这就是我建议的解决方案。
最后,映射可以是规则网格上的2值三维插值样条(XY表示图像,Z表示压力;UV值是像素坐标)。
一旦压力已知,对图像进行校正就是纹理映射。
https://stackoverflow.com/questions/28767133
复制相似问题