如何使用F-theta图表计算鱼眼相机畸变参数并完成图像校正
求解鱼眼畸变系数
k1/k2/k3/k4的方法 目前行业通用的鱼眼相机畸变多项式模型和你手里的F-theta表数据完全匹配,可按照以下步骤拟合参数:
- 先明确基础定义:入射光线与光轴的夹角为
theta(单位弧度),无畸变针孔投影下成像点到光心的像素半径为r_u = fx * tan(theta),鱼眼畸变后的实际成像半径为r_d,你手里的畸变百分比计算逻辑为 畸变百分比 = (r_d - r_u)/r_u * 100%,和该定义完全对应。 - 预处理F-theta表的采样数据:将表中角度值转成弧度单位,若表中正切位移为毫米单位,用像素单位的
fx换算成像素值:像素位移 = 毫米位移 * fx(像素/毫米),每个采样点得到theta、r_u、畸变百分比D三个值。 - 对每个采样点计算实际畸变半径:
r_d = r_u * (1 + D/100) - 代入鱼眼等距投影畸变模型:
r_d = fx * (theta + k1*theta^3 + k2*theta^5 + k3*theta^7 + k4*theta^9),该模型也是OpenCV等开源库通用的鱼眼畸变模型。 - 你手里只要有≥4个有效采样点,就可以通过最小二乘法拟合求解四个k参数,采样点较多时可搭配RANSAC剔除异常值,提高拟合精度。
基于现有参数的鱼眼图像去畸变操作
你可以选择拟合k参数后用通用库去畸变,或者直接用F-theta查表去畸变,两种方案如下:
方案1:用拟合得到的k参数去畸变
手动实现逻辑
- 遍历目标无畸变图像的每个像素坐标
(u_dst, v_dst),先转成归一化相机坐标:x = (u_dst - cx) / fx y = (v_dst - cy) / fy - 计算该点对应的无畸变半径和光线夹角:
r_u = sqrt(x^2 + y^2) theta = arctan(r_u) - 代入畸变模型计算畸变后的角度:
theta_d = theta + k1*theta^3 + k2*theta^5 + k3*theta^7 + k4*theta^9 - 计算原始鱼眼图上对应的像素坐标:
scale = r_u == 0 ? 1 : theta_d / r_u u_src = x * scale * fx + cx v_src = y * scale * fy + cy - 若
u_src、v_src在原始图像的有效像素范围内,用双线性插值取原始图像对应位置的像素值,赋值给目标图像的(u_dst, v_dst)即可。
开源库快速实现
将fx/fy/cx/cy组成3*3内参矩阵,k1/k2/k3/k4组成畸变系数向量,直接调用OpenCV的cv::fisheye::undistortImage接口即可完成去畸变,不需要手动实现全流程。
方案2:直接用F-theta表查表去畸变
如果你的F-theta表采样密度足够高,不需要拟合k参数,直接在第二步计算得到theta后,查表得到对应r_d,后续按比例缩放得到u_src/v_src即可,精度比拟合k参数更高,适合对精度要求高的量产场景。
注意:如果你使用的是毫米单位的
fx/fy,需要先根据传感器像元尺寸换算成像素单位再使用,换算公式为fx(像素)= fx(毫米) / 像元尺寸(毫米/像素)。
内容的提问来源于stack exchange,提问作者Tahera Tabassum
相关产品推荐
相关产品推荐

