Matlab双目标定结果用于opencv(C++)

矩阵的对应关系没有对应好,导致我的计算结果相差很多,这里记录一下矩阵是如何对应的
Matlab 的双目标定结果包括三部分:两个相机的内参数、畸变以及两个相机之间的旋转R、平移T。

将matlab标定的结果写入xml文件

参考了网上的代码

function writeXML2(cameraParams,file)
%writeXML(cameraParams,file)
%功能:将相机校正的参数保存为xml文件
%输入:
%cameraParams:相机校正数据结构
%file:xml文件名
%说明在xml文件是由一层层的节点组成的。
%首先创建父节点 fatherNode,
%然后创建子节点 childNode=docNode.createElement(childNodeName),
%再将子节点添加到父节点 fatherNode.appendChild(childNode)
docNode = com.mathworks.xml.XMLUtils.createDocument('opencv_storage'); %创建xml文件对象
docRootNode = docNode.getDocumentElement; %获取根节点

IntrinsicMatrix = (cameraParams.IntrinsicMatrix)'; %相机内参矩阵
RadialDistortion = cameraParams.RadialDistortion; %相机径向畸变参数向量1*3
TangentialDistortion =cameraParams.TangentialDistortion; %相机切向畸变向量1*2
Distortion = [RadialDistortion(1:2),TangentialDistortion];%,RadialDistortion(3)]; %构成opencv中的畸变系数向量[k1,k2,p1,p2,k3]

camera_matrix = docNode.createElement('camera-matrix'); %创建mat节点
camera_matrix.setAttribute('type_id','opencv-matrix'); %设置mat节点属性
rows = docNode.createElement('rows'); %创建行节点
rows.appendChild(docNode.createTextNode(sprintf('%d',3))); %创建文本节点,并作为行的子节点
camera_matrix.appendChild(rows); %将行节点作为mat子节点

cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',3)));
camera_matrix.appendChild(cols);

dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
camera_matrix.appendChild(dt);

data = docNode.createElement('data');
for i=1:3
    for j=1:3
        data.appendChild(docNode.createTextNode(sprintf('%.16f ',IntrinsicMatrix(i,j))));
    end
    data.appendChild(docNode.createTextNode(sprintf('\n')));
end
camera_matrix.appendChild(data);
docRootNode.appendChild(camera_matrix);

distortion = docNode.createElement('distortion');
distortion.setAttribute('type_id','opencv-matrix');
rows = docNode.createElement('rows');
rows.appendChild(docNode.createTextNode(sprintf('%d',5)));
distortion.appendChild(rows);

cols = docNode.createElement('cols');
cols.appendChild(docNode.createTextNode(sprintf('%d',1)));
distortion.appendChild(cols);

dt = docNode.createElement('dt');
dt.appendChild(docNode.createTextNode('d'));
distortion.appendChild(dt);
data = docNode.createElement('data');
for i=1:4
      data.appendChild(docNode.createTextNode(sprintf('%.16f ',Distortion(i))));
end
distortion.appendChild(data);

docRootNode.appendChild(distortion);

xmlFileName = file;
xmlwrite(xmlFileName,docNode);
end

运行该函数即可将自己需要的参数分别保存到对应的文件中
在这里插入图片描述

opencv使用参数

Mat cameraMatrixL(3, 3, CV_64F), distCoeffL(5, 1, CV_64F);
	Mat cameraMatrixR(3, 3, CV_64F), distCoeffR(5, 1, CV_64F);
	//左右目之间的R,t可通过stereoCalibrate()或matlab工具箱calib求得
	Mat T(3, 1, CV_64F), R(3, 3, CV_64F);
	FileStorage FL;
	FileStorage FR;
	FileStorage FRT;
	FR.open("CamerasParams/2TDanToS/intrcR.xml", FileStorage::READ);
	FL.open("CamerasParams/2TDanToS/intrcL.xml", FileStorage::READ);
	FRT.open("CamerasParams/2TDanToS/out_RT.xml", FileStorage::READ);
	if (FL.isOpened()) {
		FL["camera-matrix"] >> cameraMatrixL;
		FL["distortion"] >> distCoeffL;		
	}
	if (FR.isOpened()) {
		FR["camera-matrix"] >> cameraMatrixR;
		FR["distortion"] >> distCoeffR;
	}
	//cout << cameraMatrixL.ptr<double>(0)[2] << endl;

	if (FRT.isOpened()) {
		FRT["rotation"] >> R;
		FRT["translation"] >> T;
	}
	cout << cameraMatrixL << endl;
	cout << distCoeffL << endl;
	cout << cameraMatrixR << endl;
	cout << distCoeffR << endl;

	cout << R << endl;
	cout << T<<endl;

以上读入的参数中,需要对R进行转置,这是因为matlab的格式与opencv不完全一致导致的。即:

R=R.t();

否则虽然R的变化并不是很大,但是计算结果会有很大的误差

题外:线0.78,另0.75cm

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值