OpenCV读入Matlab标定结果的格式

来源:互联网 发布:centos系统升级 编辑:程序博客网 时间:2024/06/06 16:43

由于OpenCV自带标定函数cvStereoCalibrate()不太准确,现在流行先用Matlab标定后,再讲.xml结果导入到OpenCV。

参考http://blog.csdn.net/sunanger_wang/article/details/7744025。

先利用Matlab标定得到如下所示的结果:

Intrinsic parameters of left camera:

Focal Length:          fc_left = [ 209.35975   209.91146 ] ?[ 1.29389   1.28810 ]
Principal point:       cc_left = [ 112.70811   83.34529 ] ?[ 2.94940   2.31088 ]
Skew:             alpha_c_left = [ 0.00000 ] ?[ 0.00000  ]   => angle of pixel axes = 90.00000 ?0.00000 degrees
Distortion:            kc_left = [ 0.08414   -2.06248   -0.00441   0.00295  0.00000 ] ?[ 0.08103   0.71627   0.00294   0.00358  0.00000 ]

Intrinsic parameters of right camera:

Focal Length:          fc_right = [ 1208.84080   1208.58242 ] ?[ 3.04212   3.10299 ]
Principal point:       cc_right = [ 593.84687   340.22721 ] ?[ 5.56734   4.44145 ]
Skew:             alpha_c_right = [ 0.00000 ] ?[ 0.00000  ]   => angle of pixel axes = 90.00000 ?0.00000 degrees
Distortion:            kc_right = [ -0.17114   0.00931   -0.00018   0.00056  0.00000 ] ?[ 0.01366   0.10070   0.00083   0.00097  0.00000 ]

Extrinsic parameters (position of right camera wrt left camera):

Rotation vector:             om = [ -0.02893   -0.02493  0.00643 ] ?[ 0.01112   0.01464  0.00069 ]
Translation vector:           T = [ -39.21639   -0.63083  15.74866 ] ?[ 0.47172   0.45645  2.87469 ]

需要通过以上参数形成可导入到openCV中的M/ D/ R/ T 共4类xml文件。

OpenCV中要求的M.xml格式为

<?xml version="1.0"?>
<opencv_storage>
<M1 type_id="opencv-matrix">
  <rows>3</rows>
  <cols>3</cols>
  <dt>d</dt>
  <data>
    209.35975 0  112.70811 0
    209.91146 83.34529
    0 0 1</data></M1>
</opencv_storage>

即从左往右,从上往下5个数依次为

fx 0 cx

0 fy cy

0 0  1

而Matlab的存储格式为

Focal Length:          fc_left = [ 209.35975   209.91146 ] 

Principal point:       cc_left = [ 112.70811   83.34529 ]

fc_left = [fx fy]

cc_left = [cx cy]

故将matlab数据复制粘贴成opencv可读取的格式即可实现M.xml。

OpenCV中要求的D.xml的格式为

<?xml version="1.0"?>
<opencv_storage>
<D2 type_id="opencv-matrix">
  <rows>1</rows>
  <cols>5</cols>
  <dt>d</dt>
  <data>
    -0.93592 0.92449
    -0.00315 -0.00319
    0.00000</data></D2>
</opencv_storage>

即从左往右依次为

k1 k2 p1 p2 k3

而Matlab的存储格式为

Distortion:            kc_left = [ 0.08414   -2.06248   -0.00441   0.00295  0.00000 ]

kc_left = [k1 k2 p1 p2 0],其一般把k3设为0(若是畸变很大的摄像机,则该项不能为0).

故将matlab数据复制粘贴成opencv可读取的格式即可实现M.xml。

OpenCV中要求的R/ T格式均为

分别相对于x,y,z轴的变化量

R:

<?xml version="1.0"?>
<opencv_storage>
<R type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>d</dt>
  <data>
    0.00378 -0.00646
    -0.00241</data></R>
</opencv_storage>

Matlab中一样:

Rotation vector:             om = [ -0.02893   -0.02493  0.00643 ] ?[ 0.01112   0.01464  0.00069 ]

一般读取后使用rodrigues()函数转为3x3矩阵使用。

T:

<?xml version="1.0"?>
<opencv_storage>
<T type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>d</dt>
  <data>
    -44.47222 0.18287  0.02478</data></T>
</opencv_storage>

Matlab中一样:

Translation vector:           T = [ -39.21639   -0.63083  15.74866 ] ?[ 0.47172   0.45645  2.87469 ]

关于正负号可理解为“如何由右图像变为左图像”——从右指向左,和书上不同。

原创粉丝点击