Calibration相机内参数标定
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表示标定时采用的算法,默认为0criteria迭代的终止条件,通常忽略
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是否计算雅可比矩阵
相关文章:
Calibration相机内参数标定
1.环境依赖 本算法采用张正友相机标定法进行实现,内部对其进行了封装。 环境依赖为 ubuntu20.04 opencv4.2.0 yaml-cpp yaml-cpp安装方式: (1)git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地 &a…...
MySQL源码安装
安装MySQL 本次安装使用的是绿色硬盘版本,无需额外安装依赖环境,比较简单 cd /opt tar -xf mysql安装包 mv 解压出的目录 /usr/local/mysql #创建程序用户 useradd -M -s /sbin/nologin mysql #mysql的主配置文件设定所属用户和组 chown -R mysql.m…...
gtest单元测试:进程冻结与恢复管理模块的单元测试实现
文章目录 1. 概要2. 进程管理接口详解2.1 进程冻结与恢复的基本概念2.2 进程查找与PID获取2.3 进程冻结与恢复的实现2.3.1 进程冻结2.3.2 进程恢复 2.4 进程终止2.5 进程状态监控与控制 3. dummy_process的设计与实现3.1 创建dummy_process脚本3.2 启动dummy_process3.3 终止du…...
Flutter动画详解第二篇之显式动画(Explicit Animations)
目录 前言 一、定义 1.AnimationController 1.常用属性 1. value 2. status 3. duration 2.常用方法 1.forward 2.reverse 3.repeat 4.stop 5. reset 6. animateTo(double target, {Duration? duration, Curve curve Curves.linear}) 7.animateBack(double ta…...
python常用模块(JSON与pickle、Os模块)
一、Open函数使用 在python中,open() 函数用于打开文件,并返回一个文件对象,同时支持读取和写入文件。 基本用法: file open(file_path, moder, encodingNone, newlineNone) 其中file_path表示的是文件的路径,可以…...
MMLab-dataset_analysis
数据分析工具 这里写目录标题 数据分析工具dataset_analysis.py数据可视化分析 benchmark.pybrowse_coco_json.pybrowse_dataset.pyOptimize_anchors mmyolo、mmsegmentation等提供了数据集分析工具 dataset_analysis.py 数据采用coco格式数据 根据配置文件分析全部数据类型或…...
艺术与技术的交响曲:CSS绘图的艺术与实践
在前端开发的世界里,CSS(层叠样式表)作为网页布局和样式的基石,其功能早已超越了简单的颜色和间距设置。近年来,随着CSS3的普及,开发者们开始探索CSS在图形绘制方面的潜力,用纯粹的代码创造出令…...
基于 JAVA 的旅游网站设计与实现
点击下载源码 塞北村镇旅游网站设计 摘要 城市旅游产业的日新月异影响着村镇旅游产业的发展变化。网络、电子科技的迅猛前进同样牵动着旅游产业的快速成长。随着人们消费理念的不断发展变化,越来越多的人开始注意精神文明的追求,而不仅仅只是在意物质消…...
【C++深度探索】二叉搜索树的全面解析与高效实现
🔥 个人主页:大耳朵土土垚 🔥 所属专栏:C从入门至进阶 这里将会不定期更新有关C/C的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目录…...
Java实习记录 1 ——初入职场
Java实习记录 1 ——初入职场 引言正文收获 引言 在几个月的春招过程中,在完成学校学业的同时,进行投简历、笔试和面试。得益于较为扎实的技术基础,在暑假来临之际,找到了第一份实习工作。目前已入职将近半个月。记录一下实习经历…...
opencv—常用函数学习_“干货“_3
目录 八、图像拼接 水平拼接图像 (hconcat) 垂直拼接图像 (vconcat) 全景图像拼接 (Stitcher) 九、颜色通道及数据格式 转换图像的颜色空间 (cvtColor) 转换图像的数据类型 (convertTo) 分离和合并颜色通道 (split 和 merge) 提取和插入颜色通道 (extractChannel 和 in…...
用Docker来开发
未完成。。。 现在好像用Docker是越来越多了。之前其实也看过docker的原理,大概就是cgroup那些,不过现在就不看原理了,不谈理论,只看实际中怎么用,解决眼前问题。 用docker来做开发,其实就是解决的编译环境…...
从0开始的STM32HAL库学习2
外部中断(HAL库GPIO讲解) 今天我们会详细地学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数。 准备工作: 1、STM32开发板(我的是STM32F103C8T6) 2、STM32CubeMx软件、 IDE: Keil软件 3、STM32F1xx/ST…...
【MySQL篇】Percona XtraBackup工具备份指南:常用备份命令详解与实践(第二篇,总共五篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
Spock单元测试框架使用介绍和实践
背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计,单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…...
web安全之跨站脚本攻击xss
定义: 后果 比如黑客可以通过恶意代码,拿到用户的cookie就可以去登陆了 分类 存储型 攻击者把恶意脚本存储在目标网站的数据库中(没有过滤直接保存),当用户访问这个页面时,恶意脚本会从数据库中被读取并在用户浏览器中执行。比如在那些允许用户评论的…...
TCP与UDP的理解
文章目录 UDP协议UDP协议的特点UDP的应用以及杂项 TCP协议TCP协议段格式解释和TCP过程详解确认应答机制 -- 序号和确认序号以及6位标志位中的ACK超时重传机制连接管理机制 与标志位SYN,FIN,ACK滑动窗口与16位窗口大小流量控制拥塞控制延迟应答捎带应答和面向字节流粘包问题TCP异…...
有效应对服务器遭受CC攻击的策略与实践
分布式拒绝服务(DDoS)攻击,尤其是其中的HTTP洪水攻击或称为CC攻击(Challenge Collapsar),是当今互联网安全领域的一大挑战。这种攻击通过大量合法的请求占用大量网络资源,导致服务器无法正常响应…...
STM32判断休眠
STM32是否进入休眠模式(或称为睡眠模式)的判断主要基于其功耗状态、内部时钟的关闭情况以及唤醒后的行为。以下是根据参考文章提供的信息,判断STM32是否进入休眠模式的方法: 功耗状态: STM32在休眠模式下,功耗会显著降低。这是因为休眠模式仅关闭了内核时钟,但外设仍然保…...
TikTok内嵌跨境商城全开源_搭建教程/前端uniapp+后端源码
多语言跨境电商外贸商城 TikTok内嵌商城,商家入驻一键铺货一键提货 全开源完美运营,接在tiktok里面的商城内嵌,也可单独分开出来当独立站运营 二十一种语言,可以做很多国家的市场,支持商家入驻,多店铺等等…...
IAR平台华大HC32F460工程搭建避坑指南:从零到调试成功的全流程解析
1. 从KEIL到IAR的转型背景 最近两年芯片市场的价格波动,让很多工程师不得不重新评估开发工具链的选择。我作为一个用了五年KEIL的老用户,最近也被迫开始学习IAR平台。原因很简单——当ST单片机价格涨到华大HC32F460的十倍时,任何成本敏感的项…...
Gradio界面定制化:为DAMO-YOLO WebUI添加导出检测结果CSV功能
Gradio界面定制化:为DAMO-YOLO WebUI添加导出检测结果CSV功能 1. 项目背景与需求 如果你用过那个基于DAMO-YOLO的手机检测WebUI,可能会发现一个问题:检测结果只能看,不能存。 每次上传图片,系统会告诉你检测到了几个…...
10分钟语音如何训练专业级变声模型?Retrieval-based Voice-Conversion-WebUI全攻略
10分钟语音如何训练专业级变声模型?Retrieval-based Voice-Conversion-WebUI全攻略 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型! 项目地址: https://gitcode.com/GitHub_Trendi…...
YOLO11实战:从零到一搭建高效目标检测开发环境
1. 为什么选择YOLO11? 目标检测是计算机视觉领域最基础也最实用的技术之一。从自动驾驶的车辆识别到工业质检的缺陷检测,都离不开这项技术。而YOLO系列作为目标检测领域的"常青树",一直以速度快、精度高著称。最新推出的YOLO11在保…...
Python金融数据获取终极指南:用mootdx高效处理通达信股票数据
Python金融数据获取终极指南:用mootdx高效处理通达信股票数据 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在量化投资和金融数据分析领域,获取稳定、免费的股票数据一直…...
TypeScript——声明合并
声明合并1、接口声明合并2、枚举声明合并3、类声明合并4、命名空间声明合并4.1、命名空间与命名空间合并4.2、 命名空间与函数合并4.3、 命名空间与类合并4.4、 命名空间与枚举合并5、扩充模块声明6、扩充全局声明声明是编程语言中的基础结构,它描述了一个标识符…...
Rufus高效启动盘制作实战攻略:30分钟从入门到精通
Rufus高效启动盘制作实战攻略:30分钟从入门到精通 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 系统重装难题如何高效解决? 当你的电脑遭遇系统崩溃、病毒入侵或需要全…...
零基础玩转OpenClaw:ollama GLM-4-7-Flash镜像入门十步曲
零基础玩转OpenClaw:ollama GLM-4-7-Flash镜像入门十步曲 1. 为什么选择OpenClawGLM-4-7-Flash组合 去年我在整理个人知识库时,每天要花2小时重复处理Markdown文档和截图。直到发现OpenClaw这个能像真人一样操作电脑的开源智能体,配合ollam…...
K8s CronJob配置避坑指南:从并发策略到历史记录,这些细节你注意了吗?
K8s CronJob生产环境实战:避开那些让你夜不能寐的配置陷阱 凌晨三点,告警铃声刺破夜空——你的数据库备份任务已经连续三次未能执行,而监控面板上堆积的Job数量正在以肉眼可见的速度增长。这不是第一次了,每次CronJob出问题都像一…...
打造高效AI训练与推理服务器:2025年硬件配置与QLoRA实战指南
1. 2025年AI服务器硬件配置指南 组装一台兼顾训练和推理的AI服务器,核心在于平衡显存容量、内存带宽和计算吞吐量。2025年的硬件市场已经趋于成熟,二手显卡性价比尤为突出。我实测过多种配置组合,发现双RTX 3090的方案在微调7B-14B参数模型时…...
