使用OpenGL处理鱼眼图像信号
本篇章是OpenGL编程的一个经典应用,可以广泛使用在带有GPU的各种设备上。通过阅读本篇章,可以完全了解如何使用标定好的相机内参数据对鱼眼图像进行去畸变处理。
OpenGL
OpenGL是一套通用GPU编程接口,是操纵GPU进行图像处理的一套方法,抑或是渲染管线。
关于OpenGL的基础环境、基础原理,可以参考:主页 - LearnOpenGL CN (learnopengl-cn.github.io)
本篇章就不再赘述现代渲染管线的一些基础知识。
超大FOV鱼眼相机的成像模型
参考OpenCV的官方文档,适合鱼眼的成像数学模型是K-B通用相机模型:Kanala-Brandt畸变模型。它不同于针孔相机的5参数径向切向畸变建模,而是采用了麦克劳林多项式对畸变的光路进行建模。参考论文:《A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses》在这里我把原文贴上,有需要可以直接拿取:《A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses》
这个成像模型可以对大于90度的相机进行适合的数学建模,OpenCV的fisheye模块也采用此篇论文的设计。
参考OpenCV doc并结合论文,可以直接了解这个成像模型,后续也将在OpenGL里实现这个模型。
GLSL实现K-B鱼眼相机模型
1 | //顶点着色器 |
上面是段着色器,虽然非常不推荐在着色器里使用if语句,但是没有找到更好的办法去搞归一化。暂且先这样,后续如果想到法子会进行优化。
传参说明:
uniform mat3 cameraMatrix;
代表相机的内参矩阵,它是一个3x3的矩阵uniform vec4 distortVector;
代表KB相机模型代表的畸变系数D,它是一个有四个元素的向量
这两个参数都是作为uniform类型的变量从外部传进去的。当然,为了获得这两个参数需要对相机进行标定,标定的方法见我另一篇博客。
如何传入相机内参和畸变系数
1 | const unsigned int SCR_WIDTH = 800; |
通过传入uniform类型的参数,将相机的内参和畸变系数送进shader,在GPU中统一进行处理,能够极大加速去畸变的速度,相较于opencv的方法,它提速了十倍以上。当然,这个例程是一个简单的程序,仅作学习层面的参考,实际的工程化方面还有非常多的考量。