标定参数存取(C++、Python)

简介

在参与相机标定,输入传感器外参的场景下,经常需要初始化内外参矩阵。如果将参数写入程序则每次更换参数需要重新编译,这种做法是非常不建议的。本文讨论一下各项矩阵参数的读取。

C++

opencv

下文假设我们已经获取到了K, D, R, t, T等参数。首先看看官方提供的接口,并通过接口转换为Eigen:

cpp 复制代码
	//存储
    cv::FileStorage fs("K.yaml",cv::FileStorage::WRITE);
    fs<<"Inner"<<K;

	cv::FileStorage fs("R.yaml",cv::FileStorage::READ);
	cv::Mat R;
	fs["Rotation"] >> R;
	
	Eigen::Matrix3d R
	cv::cv2eigen(R, Rot);

还有一种通过标准库读取参数的方法,过程略显复杂:

cpp 复制代码
	#include <fstream>

	ifstream infile("K.txt");
	float a[9];
	infile >> a[1] >> a[2] >> a[3] >> 
			  a[4] >> a[5] >> a[6] >> 
			  a[7] >> a[8] >> a[9];
			  
	cv::Mat R(3, 3, CV_16C1, a);
	//或者
	cv::Mat R = (cv::Mat_<float>(3,3) << a[1], a[2], a[3], 
										 a[4], a[5], a[6],
										 a[7], a[8], a[9]   );
	

Python

Python读取参数相对简单很多,基本采用numpy的接口进行矩阵的存取。

python 复制代码
np.savetxt("K.txt", K, fmt="%06f")
np.savetxt("D.txt", D, fmt="%06f")

打开保存的txt文件,具体内容如下:

python 复制代码
717.013878 0.000000 948.354900
0.000000 717.640231 557.712712
0.000000 0.000000 1.000000

需要注意的是,数字之间是没有分割符的。因此如果使用opencv或其他库输出的文件,带有逗号等分割符的,读取时会引起异常。读取参数文件的程序如下:

python 复制代码
K = np.loadtxt("K.txt").reshape(3,3)
D = np.loadtxt("D.txt").reshape(1,-1) # 可能有4,5,8,12等不同长度的畸变参数
R = np.loadtxt("R.txt").reshape(3,3)
T = np.loadtxt("T.txt").reshape(4,4)

以上读取的变量都可以直接想opencv相关功能的函数里面塞。

相关推荐
北城笑笑3 小时前
Vue 106 ,上篇:前端桌面端应用实现方案( Electron 框架详细介绍,Vue + Electron )
前端·javascript·vue.js·python·electron
熊猫钓鱼>_>3 小时前
三方库 NDK 原生模块跨平台适配与调试【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙心迹
A7bert7773 小时前
【MobileSAM部署至RK3588】环境适配→转换RKNN→开发板部署
c++·人工智能·深度学习·目标检测·ubuntu
HANDY092003 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
青少儿编程课堂4 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
全栈练习生4 小时前
大模型原理之自适应推理
python·ai
1024奇点13 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
实名上网宋凯宣13 小时前
Django
后端·python·django
Warren2Lynch13 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
如若12314 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python