用matlab对相机进行标定获取相机内参

相机内参标定

内参是相机自身的固有参数(如焦距、主点、畸变系数)

作用是将图片中的像素坐标转换为相机坐标系下的 3D 坐标,修正相机畸变(比如鱼眼镜头的图像变形)

相机的内参虽然是固定的,但实际出厂时会有误差,所以必须先用棋盘格标定(比如 OpenCV 的标定工具),得到准确的 fx、fy、cx、cy

内参用一个 3×3 的矩阵表示,结构是:

内参矩阵每个参数的意思:

  • (f_x、f_y) :"焦距的像素表示"------fx与fy的像素值(比如 fx=500 像素)表征着相机的焦距(比如 35mm)

    就像你用手机拍杯子时:fx 决定了 "杯子在屏幕左右方向上的放大程度";fy 决定了 "杯子在屏幕上下方向上的放大程度"。

  • (c_x、c_y):"图像主点的像素坐标"------ 相机光轴(镜头中心的射线)在照片里对应的像素点(理想情况下是照片的中心,比如 1280×720 的照片,cx≈640,cy≈360)。

转换公式(核心逻辑)

如果相机坐标系里有一个物体点,坐标是(X_c, Y_c, Z_c)(Zc 是物体离相机的距离,即深度),那么它在照片里对应的像素坐标(u, v),就是通过内参矩阵计算的:

像素与相机坐标系3D 坐标转换例子:

RGBD 相机能同时拍到 "像素(u,v)" 和 "深度(Zc,即物体离相机的距离)",结合内参,就能反推出物体在相机坐标系里的 3D 坐标(X_c, Y_c, Z_c):

举个例子:

  • 相机内参:fx=500,fy=500,cx=640,cy=360;(出厂后就固定了)
  • 照片里物体的像素(坐标)是 (740, 410),深度是 0.5 米(Zc=0.5);
  • 计算得:Xc=(740-640)×0.5/500=0.1 米,Yc=(410-360)×0.5/500=0.05 米;
  • 所以物体在相机坐标系里的位置是 (0.1, 0.05, 0.5) 米。

内参的标定方法总共来说有3种,一种是使用matlab,一种是使用opencv,一种是自己写出张正友标定源码去计算内参,本文介绍matlab

用matlab对相机进行标定获取相机内参的步骤

Step1 打开相机标定工具箱

在《图像处理和计算机视觉》栏 找到相机标定工具:

选择从文件夹中导入图片(提前用你的相机从多个角度拍摄好棋盘格照片,20张)

测算,修改你的棋盘格尺寸

执行

清洗一下数据

选择输出参数

查看参数

上图划红线解释依次为:

径向畸变系数(3阶),切向畸变系数(2阶),世界坐标单位是mm,内参矩阵,焦距(分fx,fy),成像平面原点(理想情况是图像宽高中心位置),成像平面原点坐标(单位是像素);

s

相关推荐
xyq20247 小时前
jEasyUI 自定义分页
开发语言
.ZGR.7 小时前
认识数据结构:图——无人机防空平台的“衍生品”
java·开发语言·数据结构
波波0077 小时前
Native AOT 能改变什么?.NET 预编译技术深度剖析
开发语言·.net
wkm9567 小时前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
晚风吹长发8 小时前
初步了解Linux中的线程同步问题及线程安全和死锁与生产消费者模型
linux·运维·服务器·开发语言·数据结构·安全
学嵌入式的小杨同学8 小时前
【Linux 封神之路】进程进阶实战:fork/vfork/exec 函数族 + 作业实现(含僵尸进程解决方案)
linux·开发语言·vscode·嵌入式硬件·vim·软件工程·ux
fengfuyao9858 小时前
基于MATLAB/Simulink的车辆自适应巡航控制(ACC)实现
开发语言·matlab
海盗12348 小时前
WPF上位机组件开发-设备状态运行图基础版
开发语言·c#·wpf
看我干嘛!8 小时前
python第四次作业
开发语言·python