You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 07:06:00