用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

相关推荐
a1117763 分钟前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
Wang's Blog2 小时前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
吃好睡好便好5 小时前
MATLAB中图像的读取、写入和显示
开发语言·图像处理·学习·计算机视觉·matlab
yaoxin5211235 小时前
476. Java 反射 - 调用方法
java·开发语言
猫头虎5 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
bksczm6 小时前
Linux之日志和线程池、内存池
java·开发语言
笨蛋不要掉眼泪6 小时前
Java虚拟机:对象复活、引用强度与Stop-The-World
java·开发语言·jvm
code_pgf6 小时前
C/C++ 常用容器功能汇总
c语言·开发语言·c++
布朗克1686 小时前
Go 入门到精通-33-unsafe 与 CGO
开发语言·后端·golang·unsafe·cgo
个 人 练 习 生7 小时前
strcmp与strstr函数的模拟实现
c语言·开发语言·经验分享·学习·程序人生