MATLAB单目相机标定的使用并导出XML文件
- 前言
- 省略的标定工作。。。
- 参数导出XML
- 生成的XML文件
- 注意
前言
本文参考MATLAB相机标定的使用并导出XML文件。在此基础上,增加了获取输出某张标定图像对应的外参(旋转矩阵和平移向量功能)。同时,对畸变参数重新做了取舍,去除了径向畸变k3,即在标定前按默认选择“2 Coefficient”。
省略的标定工作。。。
参数导出XML
通过编写MATLAB函数向相机标定的内参和畸变参数保存为opencv可以读取的XML文件。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100function WriteXML(cameraParams,imgNum,file) %writeXML(cameraParams,file) %功能:将相机校正的参数(包括内参,外参,畸变参数)保存为xml文件 %输入: %@cameraParams:相机校正数据结构 %@imgNum:所需要获取外参的图片序号 %@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*2 %TangentialDistortion =cameraParams.TangentialDistortion; %相机切向畸变向量1*2 Distortion = RadialDistortion(1:2); %构成opencv中的畸变系数向量[k1,k2]忽略p1,p2,k3 RotationMatrice = cameraParams.RotationMatrices(:,:,imgNum);%这里取所需要图片对应的外参旋转矩阵 TranslationVector = cameraParams.TranslationVectors(imgNum:imgNum,1:3);%这里取所需要图片对应的外参平移向量 %1-内参 camera_matrix = docNode.createElement('IntrinsicMatrix'); %创建mat节点 camera_matrix.setAttribute('type_id','Opencv-IntrinsicMatrix'); %设置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); data = docNode.createElement('data'); for i=1:3 for j=1:3 data.appendChild(docNode.createTextNode(sprintf('%.4f ',IntrinsicMatrix(i,j)))); end %data.appendChild(docNode.createTextNode(sprintf('n'))); end camera_matrix.appendChild(data); docRootNode.appendChild(camera_matrix); %2-畸变 distortion = docNode.createElement('Distortion'); distortion.setAttribute('type_id','Opencv-Distortion'); rows = docNode.createElement('rows'); rows.appendChild(docNode.createTextNode(sprintf('%d',2))); distortion.appendChild(rows); cols = docNode.createElement('cols'); cols.appendChild(docNode.createTextNode(sprintf('%d',1))); distortion.appendChild(cols); data = docNode.createElement('data'); for i=1:2 data.appendChild(docNode.createTextNode(sprintf('%.16f ',Distortion(i)))); end distortion.appendChild(data); docRootNode.appendChild(distortion); %3-外参.旋转 rotation = docNode.createElement('Rotation'); %创建mat节点 rotation.setAttribute('type_id','Opencv-Rotation'); %设置mat节点属性 rows = docNode.createElement('rows'); %创建行节点 rows.appendChild(docNode.createTextNode(sprintf('%d',3))); %创建文本节点,并作为行的子节点 rotation.appendChild(rows); %将行节点作为mat子节点 cols = docNode.createElement('cols'); cols.appendChild(docNode.createTextNode(sprintf('%d',3))); rotation.appendChild(cols); %设置当前图片序号节点 dt = docNode.createElement('imgNum'); dt.appendChild(docNode.createTextNode(sprintf('%d',imgNum))); rotation.appendChild(dt); data = docNode.createElement('data'); for i=1:9 data.appendChild(docNode.createTextNode(sprintf('%.5f ',RotationMatrice(i)))); if mod(i,3)==0 %data.appendChild(docNode.createTextNode(sprintf('n')));%为了方便导出,不换行了 end end rotation.appendChild(data); docRootNode.appendChild(rotation); %4-外参.平移 translation = docNode.createElement('TranslationVector'); translation.setAttribute('type_id','Opencv-TranslationVector'); rows = docNode.createElement('rows'); rows.appendChild(docNode.createTextNode(sprintf('%d',3))); translation.appendChild(rows); cols = docNode.createElement('cols'); cols.appendChild(docNode.createTextNode(sprintf('%d',1))); translation.appendChild(cols); %设置当前图片序号节点 dt = docNode.createElement('imgNum'); dt.appendChild(docNode.createTextNode(sprintf('%d',imgNum))); translation.appendChild(dt); data = docNode.createElement('data'); for i=1:3 data.appendChild(docNode.createTextNode(sprintf('%.4f ',TranslationVector(i)))); end translation.appendChild(data); docRootNode.appendChild(translation); xmlFileName = file; xmlwrite(xmlFileName,docNode); end
调用如下:
复制代码
1
2>> WriteXML(cameraParams,1,'cameraParams.xml');
生成的XML文件
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<?xml version="1.0" encoding="utf-8"?> <opencv_storage> <IntrinsicMatrix type_id="Opencv-IntrinsicMatrix"> <rows>3</rows> <cols>3</cols> <data>5013.3472 0.0000 0.0000 0.0000 5015.6284 0.0000 2712.3625 1808.7330 1.0000 </data> </IntrinsicMatrix> <Distortion type_id="Opencv-Distortion"> <rows>2</rows> <cols>1</cols> <data>-0.0601982111953816 0.1307347481452408 </data> </Distortion> <Rotation type_id="Opencv-Rotation"> <rows>3</rows> <cols>3</cols> <imgNum>22</imgNum> <data>-0.94216 -0.08345 0.32462 0.02031 -0.98095 -0.19321 0.33456 -0.17544 0.92590 </data> </Rotation> <TranslationVector type_id="Opencv-TranslationVector"> <rows>3</rows> <cols>1</cols> <imgNum>22</imgNum> <data>671.6897 195.2475 2951.0166 </data> </TranslationVector> </opencv_storage>
注意
- 生成的内参矩阵需要转置
- 生成的外参旋转矩阵需要转置
- 生成的外参平移向量顺序为:Tx,Ty,Tz
最后
以上就是温柔御姐最近收集整理的关于MATLAB单目相机标定的使用并导出XML文件前言省略的标定工作。。。参数导出XML生成的XML文件注意的全部内容,更多相关MATLAB单目相机标定内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复