用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

相关推荐
毕设源码-邱学长6 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
rookieﻬ°7 小时前
PHP框架漏洞
开发语言·php
炸膛坦客8 小时前
单片机/C/C++八股:(二十)指针常量和常量指针
c语言·开发语言·c++
兑生8 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
炸膛坦客9 小时前
单片机/C/C++八股:(十九)栈和堆的区别?
c语言·开发语言·c++
零雲9 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
Jay_Franklin10 小时前
Quarto与Python集成使用
开发语言·python·markdown
2401_8318249610 小时前
代码性能剖析工具
开发语言·c++·算法
是wzoi的一名用户啊~10 小时前
【C++小游戏】2048
开发语言·c++
Sunshine for you11 小时前
C++中的职责链模式实战
开发语言·c++·算法