从零理解鱼眼相机的标定与矫正(含 OpenCV 代码与原理讲解)

本文适合初学者系统掌握鱼眼镜头的标定与矫正原理,图文结合,带你从 0 到 1 理解 K, D, u,v 等参数的真实含义。


📌 一句话总结

鱼眼相机由于镜头视角宽、畸变大,拍出来的画面会"鼓起来"或者变形。通过标定得到的参数,可以让计算机"理解"这种变形是怎么发生的,并据此把图像"拉回正形"。


📐 一、什么是内参矩阵 K?

🔹 定义

在 OpenCV 中,内参矩阵(Camera Intrinsic Matrix)通常是一个 3x3 的矩阵:

cpp 复制代码
cfg.K = cv::Matx33d(
    fx, 0, cx,
    0, fy, cy,
    0, 0, 1
);

你可能会看到这样的数值:

cpp 复制代码
cfg.K = cv::Matx33d(
    436.38, 0,     966.97,
    0,     436.01, 556.57,
    0,     0,      1
);
矩阵元素 含义
fx X 方向焦距(单位:像素)
fy Y 方向焦距(单位:像素)
cx 主点横坐标(图像中心 X)
cy 主点纵坐标(图像中心 Y)

✅ 这个矩阵定义了相机如何将三维空间的点 (X, Y, Z) 投影到图像上的像素点 (u, v)。


🌀 二、什么是畸变系数 D?

鱼眼镜头会让图像产生严重的边缘弯曲,OpenCV 提供了畸变系数来描述这种变形。

cpp 复制代码
cfg.D = cv::Vec4d(k1, k2, k3, k4);

示例:

cpp 复制代码
cfg.D = cv::Vec4d(
    0.0130, 0.0029, -0.0016, 0.000017
);
  • k1, k2, k3, k4 是四个畸变参数
  • 适用于 OpenCV 的 fisheye 模块(与普通畸变模型不同)

🔍 三、如何进行图像矫正?

OpenCV 使用以下 API:

cpp 复制代码
cv::Mat map1, map2;
cv::fisheye::initUndistortRectifyMap(
    cfg.K, cfg.D, cv::Mat::eye(3, 3, CV_64F),  // 内参、畸变、旋转矩阵
    cfg.K, image.size(),                      // 新的投影矩阵、图像尺寸
    CV_16SC2, map1, map2
);

cv::Mat undistorted;
cv::remap(inputImage, undistorted, map1, map2, cv::INTER_LINEAR);

✅ 步骤解释:

  1. initUndistortRectifyMap() 生成像素映射规则(map)
  2. remap() 按照 map 把每个像素"搬"回它该在的位置

🧠 四、图像坐标系 (u, v) 是啥?

坐标 含义
u 水平方向像素坐标(从左到右)
v 垂直方向像素坐标(从上到下)

图像坐标从左上角 (0,0) 开始,右下角是 (width-1, height-1)。


🧮 五、像素点是如何计算出来的?

相机模型里有这样一组公式:

cpp 复制代码
u = fx * (X/Z) + cx
v = fy * (Y/Z) + cy

📌 表示一个 3D 世界点 (X,Y,Z) 被投影成 2D 图像坐标 (u,v)。

变量 含义
(X,Y,Z) 世界坐标系中的 3D 点
(u,v) 相应的图像坐标(像素)
fx, fy 焦距乘以像素密度,缩放比例
cx, cy 图像中心(主点),像素偏移量

🎥 六、实际标定流程

拍摄棋盘格图像后,OpenCV 提供了函数可直接求出 K, D:

cpp 复制代码
cv::fisheye::calibrate(
    objectPoints, imagePoints, imageSize,
    K, D, rvecs, tvecs,
    cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC,
    cv::TermCriteria(3, 20, 1e-6)
);
  • objectPoints: 棋盘格上每个点在 3D 空间的坐标
  • imagePoints: 图像中检测到的角点像素坐标
  • K, D: 得到的内参和畸变参数

🧾 七、总结表格

项目 含义
K 相机内参,描述镜头成像方式
D 鱼眼畸变系数,描述弯曲程度
u, v 图像上的像素坐标
fx, fy 像素缩放系数(与镜头焦距有关)
cx, cy 主点位置,决定图像中心偏移
矫正流程 利用 initUndistortRectifyMap + remap 实现

如果这篇文章帮你理清了思路,欢迎 👍点赞 / ⭐收藏 / 💬留言交流!


相关推荐
AomanHao4 小时前
【阅读笔记】Weighted Guided Image Filtering(WGIF)权重引导滤波
图像处理·人工智能·笔记·计算机视觉·滤波·引导滤波
高升说4 小时前
避障相机与激光雷达的硬件融合:时基、外参、算力与布局的工程实现
人工智能·数码相机
竹之月5 小时前
MCGS昆仑通态触摸屏背景图分辨率太大,告警解决
人工智能·经验分享
kaka.liulin -study5 小时前
Colulu Agents Workflow:业财一体化分析示例
人工智能·数据分析·multi agents
企业解惑小能手-域智盾系统5 小时前
实战教程:企业终端如何监控AI对话记录,落地影子AI风险治理
人工智能·域智盾
问商十三载6 小时前
GEO优化有用吗?基于检索与信源机制的有效性分析
大数据·人工智能·机器学习
m4Rk_12 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
运行时异常12 小时前
【WMS 仓储系统集成 AI Agent 实战】第 8 讲(终篇):生产部署与并发安全——Semaphore 放进 Flux.defer 的坑,压测抓了一晚上
人工智能·安全
杨杨杨大侠13 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
代码方舟13 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化