Calibration相机内参数标定

news/2024/9/18 20:50:40/ 标签: 数码相机, 算法

1.环境依赖

算法采用张正友相机标定法进行实现,内部对其进行了封装。

环境依赖为 ubuntu20.04 + opencv4.2.0 + yaml-cpp

yaml-cpp安装方式:

(1)git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地

(2)进入下载目录中,mkdir build && cd build #构建build文档

(3)cmake .. #使用cmake构建

(4)sudo make install #安装yaml-cpp

仓库下载:

git clone https://gitee.com/BingbingSuperEffort/calibration.git

2.使用方式

使用cmake构建执行文件

mkdir build && cd build && cmake.. && make

编译的可执行文件为Calibration,使用时运行该文件并配备图片文件夹路径作为参数,该文件夹内部为相机拍摄的不同角度与不同高度的棋盘照片。

使用示例:./Calibration ./test-jpg

3.配置文件

配置文件为config.yaml 内部包含如下配置:

(1)chess_row,chess_col 棋盘格行列个数:该参数表示相机标定使用的黑白棋盘格的行和列上的方格个数,请确保行列正确

(2)square_size 棋盘方格大小:该参数表示每个黑白方格的长度数值

(3)image_path 读取文件路径记录名:该参数为读取的含有棋盘的具体图片的路径名称记录,可以查阅本次标定具体使用了哪些图片,参数以弃用,不在输出路径记录文档。

(4)image_suffix 图片名称后缀:该参数表面在文件夹中查找哪种类型的图片参数,支持jpg与png格式,参数以弃用。内部将直接搜索文件夹中.jpg.png格式的所有图片

(5)camera_matrix_file 输出文件名:该参数指定了yaml格式的输出文件,文件内部包含测定后的内参数的具体数值

(6)output_detail 是否输出更详细的数据参数:默认为false,不输出更详细的参数,设置为true将输出每张图片的像素误差,以及整体误差等详细的参数,会将结果保存到camera_result_detail.txt 文件中

(7)camera_type标定相机的具体类型,CV为普通相机,FISHEYE为鱼眼相机

(8)downsample是否降采样采取角点,处理像素高的照片速度快,像素低可能会检测不到角点,导致评定失败,默认为true

(9)show_draw是否显示角点绘制过程,默认为false,在处理大文件时应当关闭,避免卡死

(10)undistort是否对图像实现畸变矫正,并显示矫正后的效果,默认为false

(11)test_image_path实现畸变矫正的测试图片路径,仅在undistort为true时有效

4.输出文件

image_path.txt 测定的具体图片的名称路径

camera_matrix.yaml 相机内参数fx,fy,cx,cy,畸变系数k1,k2,p1,p2,p3(或者k1,k2,u1,u2),图片长宽。

camera_result_detail.txt 相机测定具体的数值,包含每幅图片的标定误差,总体平均误差,每幅图像的畸变系数。只有在配置文件中设置才会输出该文件。

5.标定流程

6.文件介绍

各个文件简要说明:

main.cpp:主要为接口函数,以及一些接口参数的设置。编译成为可执行文件后,在使用时传入测定图片的文件夹路径

CCalibration类实现摄像机标定功能,calibration.run()执行读取标定板图片、角点检测、亚像素精确化、摄像机标定、计算重投影误差、保存标定参数功能;

CUndistort类实现畸变校正功能,undistort.run()执行读取内部参数、读取畸变图像、畸变校正、显示校正结果功能。执行时默认不进行畸变校正,如需打开请在config.yaml中将undistort参数设置为true。

calibration.h, calibration.cpp:实现摄像机标定,包含CV模型和Fisheye模型。默认为CV模型,如需更换为Fisheye模型,请在config.yaml中将camera_type参数设置为FISHEYE。

undistort.h, undistort.cpp:实现畸变校正,包含CV模型和Fisheye模型。如需更换为Fisheye模型,请在config.yaml中将camera_type参数设置为FISHEYE。

7.使用函数

1.findChessboardCorners()角点提取函数。

函数功能:

该函数的功能就是判断图像内是否包含完整的棋盘图,如果能够检测完全,就把他们的角点坐标按 顺序(逐行,从左到右)记录下来,并返回非0数,否则返回0。 这里对size参数要求非常严格,函数必须检测到相同的size才会返回非0,否则返回0。

函数原型:

bool cv::findChessboardCorners ( InputArray image,
Size patternSize,
OutputArray corners,
int flags = CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE
);

参数介绍:

image输入的棋盘格原图。必须是8位灰度图或者彩色图像

patternSize棋盘格图片的每一行每一列的内角点数

corners输出检测到的角点阵列

flags标志位,默认为0

2.find4QuadCornerSubpix()亚像素角点提取函数

函数功能:

该函数的目的是提高角点检测的精度,特别是当使用亚像素精度进行定位时。在图像中,四角形的角点可能因为各种因素(如图像噪声、模糊等)而不完全清晰。find4QuadCornerSubpix() 函数通过在角点附近进行更细致的搜索,来提高角点的定位精度。

函数原型:

bool cv::find4QuadCornerSubpix(InputArray image, 
InputOutputArray corners, 
Size region_size);

参数介绍:

img输入图片矩阵

corners初始的角点坐标

region_size角点搜索窗口大小

3.drawChessboardCorners()角点绘制函数

函数功能:

该函数的主要作用是帮助用户直观地展示检测到的棋盘格角点位置,以便于调试和验证。

函数原型:

void cv::drawChessboardCorners(InputOutputArray image, 
Size patternSize, 
const Mat& corners, 
bool patternWasFound);

参数介绍:

imagecv::Mat& 类型,这是要在其上绘制角点的输出图像。函数执行后,图像上会显示棋盘格的角点。

patternSizecv::Size& 类型,这是一个 cv::Size 结构,表示棋盘格的内部角点数。

corners const std::vector<cv::Point2f>& 类型,这是一个包含棋盘格角点坐标的向量。这些坐标通过角点检测算法(如 findChessboardCorners())获得。

patternWasFoundbool 类型,一个布尔值,指示棋盘格模式是否被成功检测。如果 true,角点将被绘制;如果 false,角点将不会被绘制。

4.calibrateCamera()相机标定函数

函数功能:

该函数用于相机标定,即确定相机的内参和(可选)外参。相机内参包括焦距、主点坐标和畸变系数,而外参则包括相机相对于某一特定坐标系的位置和旋转

函数原型:

double cv::calibrateCamera ( InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints,
Size imageSize,
InputOutputArray cameraMatrix,
InputOutputArray distCoeffs,
OutputArrayOfArrays rvecs,
OutputArrayOfArrays tvecs,
int flags = 0,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON)
);

参数介绍:

objectPoints一系列角点的三维坐标。

imagesPoints角点投影到标定图案平面上的二维坐标点。

imageSize图片的尺寸大小,用以初始化相机内参。

cameraMatrix相机的内参矩阵。

distCoeffs相机的畸变参数矩阵,有5个畸变参数:k1,k2,p1,p2,k3

rvecs旋转向量

tvecs平移向量

flags表示标定时采用的算法,默认为0
criteria迭代的终止条件,通常忽略

5.projectPoints()重投影函数

函数功能:

根据相机的内参(焦距和主点坐标)和畸变系数,将三维点转换为图像上的二维点。对计算结果进行评定。

函数原型:

void cv::projectPoints ( InputArray objectPoints,
OutputArray imagePoints,
InputArray rvec,
InputArray tvec,
InputArray K,
InputArray D,
double alpha = 0,
OutputArray jacobian = noArray()
);

参数介绍:

objectPoints对象点的数组

imagesPoints若干张图片对应的若干的内角点的坐标

rvecs旋转向量

tvecs平移向量

K内参矩阵

D畸变矩阵

alpha偏斜系数

jacobian是否计算雅可比矩阵


http://www.ppmy.cn/news/1475973.html

相关文章

开源科学工程技术软件

目录 0 参考链接 1 Silx 2 Klampt 3 参数化三维3D软件Dune 3D 4 GPS日志文件查看器GPXSee 5 三维3D软件Chili3D 6 集成电路设计软件XicTools 7 天文学软件Cosmonium 8 计算流体力学软件FluidX3D 9 点云处理软件CloudCompare 10 野外火灾建模软件WindNinja 11 电子设…

DVC+Minio

由于参数文件比较大&#xff0c;因此onnx、engine等大文件弃用LFS管理&#xff0c;改用dvc管理&#xff1a; minio就是存储用的 启动miniosudo netstat -ntpl#查看端口号 sudo kill -9 $(sudo lsof -i:5061 -t) 关闭端口对应进程 ./minio server --console-address ":6570…

昇思25天学习打卡营第二十四天|基于MindSpore通过GPT实现情感分类

基于MindSpore通过GPT实现情感分类 导入数据集 import osimport mindspore from mindnlp._legacy.engine import Evaluator, Trainer from mindnlp._legacy.engine.callbacks import BestModelCallback, CheckpointCallback from mindnlp._legacy.metrics import Accuracy fr…

【Vue3】4个比较重要的设计模式!!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是 Vue 框架,然而其代码结构紊乱不堪,可维护性极度糟糕😫。 这使我深刻领会到,理解并运用 Vue 中的重要设计模式是何等关键! …

#if defined(WEBRTC_USE) webrtc.a的宏机制

#ifndef是 if not define的缩写,#ifdef 是 if define 的缩写。 define有两种,一种是单纯宏定义,一种是定义宏为特定值。 #define WEBRTC_USE_H264#defined WEBRTC_USE_H264 11.1定义值用作预处理: #define A 0

NAT地址转换+多出口智能选路,附加实验内容

本章主要讲&#xff1a;基于目标IP、双向地址的转换 注意&#xff1a;基于目标NAT进行转换 ---基于目标IP进行地址转换一般是应用在服务器端口映射&#xff1b; NAT的基础知识 1、服务器映射 服务器映射是基于目标端口进行转换&#xff0c;同时端口号也可以进行修改&…

堆、栈和队列(数据结构)

堆、栈和队列&#xff08;数据结构&#xff09; 这里写目录标题 堆、栈和队列&#xff08;数据结构&#xff09;**栈****队列**堆&#xff08;Heap&#xff09;&#xff08;&#xff09;队列&#xff08;Queue&#xff09;&#xff08;FIFO&#xff09;栈&#xff08;Stack&…

【C++】15.二叉搜索树

一、二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左…

vue中缩放比的使用

大屏适用性比较大&#xff0c;后台系统不推荐 抽组件&#xff0c;scaleScreen <template><divid"screen":style"{width: ${style.width}px,height: ${style.height}px,transform: ${style.transform},}"><slot ></slot></div&g…

leetcode:2833. 距离原点最远的点(python3解法)

难度&#xff1a;简单 给你一个长度为 n 的字符串 moves &#xff0c;该字符串仅由字符 L、R 和 _ 组成。字符串表示你在一条原点为 0 的数轴上的若干次移动。 你的初始位置就在原点&#xff08;0&#xff09;&#xff0c;第 i 次移动过程中&#xff0c;你可以根据对应字符选择…

debian固定ip

debian固定ip 前言 安装好的Debian系统后&#xff0c;为了确保每次登陆的ip不变&#xff0c;需要固定 方法 命令如下 ip addr | grep inet因为有有线网和无线网 2 种连接方式&#xff0c;因此需要区别。 其中 enp 的是有线&#xff0c;wlp 的是无线 查看网关 IP 命令如下 …

Jenkins中Node节点与构建任务

目录 节点在 Jenkins 中的主要作用 1. 分布式构建 分布式处理 负载均衡 2. 提供不同的运行环境 多平台支持 特殊环境需求 3. 提高资源利用率 动态资源管理 云端集成 4. 提供隔离和安全性 任务隔离 权限控制 5. 提高可扩展性 横向扩展 高可用性 Jenkins 主服务…

Elasticsearch索引管理和生命周期管理

在大数据和搜索引擎技术日益成熟的今天&#xff0c;Elasticsearch作为一款基于Lucene构建的开源搜索引擎&#xff0c;凭借其强大的全文搜索能力、分布式架构以及可扩展性&#xff0c;在日志分析、实时监控、应用搜索等多个领域得到了广泛应用。然而&#xff0c;随着数据量的不断…

前端框架入门之Vue _el和data的两种写法 分析MVVM模型

目录 _el与data的两种写法 MVVM模型 _el与data的两种写法 查看vue的实例对象 我们在这边注释掉了el属性 这样的话div容器就绑定不了vue实例 当我们可以在这里写一个定时任务 然后再回头指定 这个mount有挂载的意思 就是把容器对象交给vue实例后 去给他挂载指定的对象 &…

网络基础:Vlan原理与配置

VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种将一个物理网络划分为多个逻辑子网的技术。它通过在网络交换机上配置&#xff0c;使得不同VLAN中的设备即使连接在同一个物理交换机上&#xff0c;也不能直接进行通信&#xff0c;从而实现…

10校大满贯!中国内地高校2024年1-6月CNS发文统计出炉

随着全球科研竞争的日趋激烈&#xff0c;CNS&#xff08;Cell、Nature、Science&#xff09;作为科学领域的三大顶级期刊&#xff0c;不仅是科研成果的展示平台&#xff0c;更是各国科研实力比拼的重要战场。近年来&#xff0c;中国高校在国际科研舞台上的表现愈发抢眼&#xf…

vuepress 配置文件分类管理

背景 在.vuepress的config.js配置文件中&#xff0c;我们需要设置head, plugins, nav三项主要配置。 如果都写在config.js就会显得很臃肿&#xff0c;不便于维护。 代码 config.js const headConf require("./config/headConf"); const pluginsConf require(&q…

Hadoop3:HDFS-集群安全模式

一、基本介绍 1、安全模式 文件系统只接受读数据请求&#xff0c;而不接受删除、修改等变更请求 2、 二、进入安全模式场景 1、NameNode在加载镜像文件和编辑日志期间处于安全模式&#xff08;就是启动集群的时候&#xff09;&#xff1b; 2、NameNode再接收DataNode注册时…

深入解析HTTP与HTTPS:定义、架构、原理、应用场景及实战指南

前言 在互联网技术飞速发展的今天&#xff0c;HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;已经成为Web通信的基础协议。无论是浏览网页、提交表单&#xff0c;还是进行数据交互&#xff0c;HT…

Apache Omid TSO 组件源码实现原理

Apache Omid TSO 组件实现原理 作用 独立进程&#xff0c;处理全局事务之间的并发冲突。 流程 TSOChannelHandler#channelRead -> AbstractRequestProcessor -> PersistenceProcessorHandler 总体流程 thread1TSOChannelHandler#channelReadAbstractRequestProcess…