相机标定参数Matlab转OpenCV格式脚本程序

注意事项

  1. OpenCV中畸变参数的排列顺序为 [ k 1 , k 2 , p 1 , p 2 , k 3 , ⋯   ] [k_1,k_2,p_1,p_2,k_3,\cdots] [k1,k2,p1,p2,k3,],提取Matlab相机标定结构数据中的畸变参数时,顺序必须与其一致;
  2. 提取Matlab相机标定结构数据中的旋转矩阵时,需要进行转置(或求逆)。

0 FileStorage类读取xml文件

cv::FileStorage file_storage("xml_path.xml", cv::FileStorage::READ);
file_storage["LeftIntrinsics"] >> mat33d_left_intrinsics;
file_storage["LeftDistortionCoeffs"] >> mat51d_left_distort_coeffs;
file_storage["RightIntrinsics"] >> mat33d_right_intrinsics;
file_storage["RightDistortionCoeffs"] >> mat51d_right_distort_coeffs;
file_storage["Translation"] >> mat31d_cam_translation;
file_storage["Rotation"] >> mat33d_cam_rotation;

1 手动标定工具箱

1.1 单目标定

% 该脚本文件用于将由老版本Matlab标定工具箱(手动提取标定板角点)
% 标定获取的相机标定数据转换成能够被OpenCV FileStorage类读取的“.xml”格式文件
% 文件默认保存路径为当前工作目录,可修改路径

% 将标定获取的数据存入IntrinsicsMatrix和DistCoeffMatrix两个矩阵中
IntrinsicsMatrix = zeros(3, 3);
IntrinsicsMatrix(1, 1) = fc(1);
IntrinsicsMatrix(2, 2) = fc(2);
IntrinsicsMatrix(1, 3) = cc(1);
IntrinsicsMatrix(2, 3) = cc(2);
IntrinsicsMatrix(3, 3) = 1;
DistCoeffMatrix = kc;

% 生成根节点“opencv_storage”
xmldoc = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xmlroot = xmldoc.getDocumentElement;

%% 在根节点“opencv_storage”下生成二级子节点“Intrinsics”
Intrinsics = xmldoc.createElement('Intrinsics');
xmlroot.appendChild(Intrinsics);
Intrinsics.setAttribute('type_id','opencv-matrix');
% 在二级子节点“Intrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(rows);
% 在二级子节点“Intrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(cols);
% 在二级子节点“Intrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Intrinsics.appendChild(dt);
% 在二级子节点“Intrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3
    for j = 1 : 3
        data.appendChild(xmldoc.createTextNode(sprintf('%f', IntrinsicsMatrix(i, j))));
        if((i == 3) && (j == 3))
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
    end
end
Intrinsics.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“Distortion_Coefficients”
Distortion_Coefficients = xmldoc.createElement('Distortion_Coefficients');
xmlroot.appendChild(Distortion_Coefficients);
Distortion_Coefficients.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
Distortion_Coefficients.appendChild(rows);
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
Distortion_Coefficients.appendChild(cols);
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Distortion_Coefficients.appendChild(dt);
% 在二级子节点“Distortion_Coefficients”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5
        data.appendChild(xmldoc.createTextNode(sprintf('%f', DistCoeffMatrix(k))));
        if(k == 5)
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
end
Distortion_Coefficients.appendChild(data);

str = strcat('MonoCalibration', '.xml');
xmlwrite(str, xmldoc);

2 Matlab R2015a

2.1 单目标定

% 该脚本文件用于将由Matlab R2015a标定工具箱(自动提取标定板角点)
% 标定获取的单目相机标定数据转换成能够被OpenCV FileStorage类读取的“.xml”格式文件
% 文件默认保存路径为当前工作目录,可修改路径

% 将标定获取的数据存入IntrinsicMatrix和DistCoeffMatrix两个矩阵中
IntrinsicMatrix = cameraParams.IntrinsicMatrix';
DistCoeffMatrix = zeros(1, 5);
DistCoeffMatrix(1, 1) = cameraParams.RadialDistortion(1);
DistCoeffMatrix(1, 2) = cameraParams.RadialDistortion(2);
DistCoeffMatrix(1, 3) = cameraParams.TangentialDistortion(1);
DistCoeffMatrix(1, 4) = cameraParams.TangentialDistortion(2);
if(cameraParams.NumRadialDistortionCoefficients == 3)
    DistCoeffMatrix(1, 5) = cameraParams.RadialDistortion(3);
end

% 生成根节点“opencv_storage”
xmldoc = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xmlroot = xmldoc.getDocumentElement;

%% 在根节点“opencv_storage”下生成二级子节点“Intrinsics”
Intrinsics = xmldoc.createElement('Intrinsics');
xmlroot.appendChild(Intrinsics);
Intrinsics.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Intrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(rows);
% 在二级子节点“Intrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Intrinsics.appendChild(cols);
% 在二级子节点“Intrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Intrinsics.appendChild(dt);
% 在二级子节点“Intrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3
    for j = 1 : 3
        data.appendChild(xmldoc.createTextNode(sprintf('%f', IntrinsicMatrix(i, j))));
        if((i == 3) && (j == 3))
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
    end
end
Intrinsics.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“DistortionCoeff”
DistortionCoeff = xmldoc.createElement('DistortionCoeff');
xmlroot.appendChild(DistortionCoeff);
DistortionCoeff.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“DistortionCoeff”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
DistortionCoeff.appendChild(rows);
% 在二级子节点“DistortionCoeff”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
DistortionCoeff.appendChild(cols);
% 在二级子节点“DistortionCoeff”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
DistortionCoeff.appendChild(dt);
% 在二级子节点“DistortionCoeff”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5
        data.appendChild(xmldoc.createTextNode(sprintf('%f', DistCoeffMatrix(1, k))));
        if(k == 5)
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
end
DistortionCoeff.appendChild(data);

str = strcat('BinoCalibration', '.xml');
xmlwrite(str, xmldoc);

2.2 双目标定

% 该脚本文件用于将由Matlab R2015a标定工具箱(自动提取标定板角点)
% 双目标定获取的相机标定数据转换成能够被OpenCV FileStorage类读取的“.xml”格式文件
% 文件默认保存路径为当前工作目录,可修改路径

% 将标定获取的左相机数据存入LeftIntrinsicMatrix和LeftDistCoeffMatrix两个矩阵中
LeftIntrinsicMatrix = stereoParams.CameraParameters1.IntrinsicMatrix';
LeftDistCoeffMatrix = zeros(1, 5);
LeftDistCoeffMatrix(1, 1) = stereoParams.CameraParameters1.RadialDistortion(1);
LeftDistCoeffMatrix(1, 2) = stereoParams.CameraParameters1.RadialDistortion(2);
LeftDistCoeffMatrix(1, 3) = stereoParams.CameraParameters1.TangentialDistortion(1);
LeftDistCoeffMatrix(1, 4) = stereoParams.CameraParameters1.TangentialDistortion(2);
if(stereoParams.CameraParameters1.NumRadialDistortionCoefficients == 3)
    LeftDistCoeffMatrix(1, 5) = stereoParams.CameraParameters1.RadialDistortion(3);
end

% 将标定获取的右相机数据存入RightIntrinsicMatrix和RightDistCoeffMatrix两个矩阵中
RightIntrinsicMatrix = stereoParams.CameraParameters2.IntrinsicMatrix';
RightDistCoeffMatrix = zeros(1, 5);
RightDistCoeffMatrix(1, 1) = stereoParams.CameraParameters2.RadialDistortion(1);
RightDistCoeffMatrix(1, 2) = stereoParams.CameraParameters2.RadialDistortion(2);
RightDistCoeffMatrix(1, 3) = stereoParams.CameraParameters2.TangentialDistortion(1);
RightDistCoeffMatrix(1, 4) = stereoParams.CameraParameters2.TangentialDistortion(2);
if(stereoParams.CameraParameters2.NumRadialDistortionCoefficients == 3)
    RightDistCoeffMatrix(1, 5) = stereoParams.CameraParameters2.RadialDistortion(3);
end

% 将标定获取的左右相机相对位姿数据存入TranslationMatrix和RotationMatrix两个矩阵中
TranslationMatrix = zeros(1, 3);
TranslationMatrix(1, 1) = stereoParams.TranslationOfCamera2(1);
TranslationMatrix(1, 2) = stereoParams.TranslationOfCamera2(2);
TranslationMatrix(1, 3) = stereoParams.TranslationOfCamera2(3);
RotationMatrix = stereoParams.RotationOfCamera2';

% 生成根节点“opencv_storage”
xmldoc = com.mathworks.xml.XMLUtils.createDocument('opencv_storage');
xmlroot = xmldoc.getDocumentElement;

%% 在根节点“opencv_storage”下生成二级子节点“LeftIntrinsics”
LeftIntrinsics = xmldoc.createElement('LeftIntrinsics');
xmlroot.appendChild(LeftIntrinsics);
LeftIntrinsics.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“LeftIntrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
LeftIntrinsics.appendChild(rows);
% 在二级子节点“LeftIntrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
LeftIntrinsics.appendChild(cols);
% 在二级子节点“LeftIntrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
LeftIntrinsics.appendChild(dt);
% 在二级子节点“LeftIntrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3
    for j = 1 : 3
        data.appendChild(xmldoc.createTextNode(sprintf('%f', LeftIntrinsicMatrix(i, j))));
        if((i == 3) && (j == 3))
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
    end
end
LeftIntrinsics.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“LeftDistortionCoeffs”
LeftDistortionCoeffs = xmldoc.createElement('LeftDistortionCoeffs');
xmlroot.appendChild(LeftDistortionCoeffs);
LeftDistortionCoeffs.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
LeftDistortionCoeffs.appendChild(rows);
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
LeftDistortionCoeffs.appendChild(cols);
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
LeftDistortionCoeffs.appendChild(dt);
% 在二级子节点“LeftDistortionCoeffs”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5
        data.appendChild(xmldoc.createTextNode(sprintf('%f', LeftDistCoeffMatrix(1, k))));
        if(k == 5)
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
end
LeftDistortionCoeffs.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“RightIntrinsics”
RightIntrinsics = xmldoc.createElement('RightIntrinsics');
xmlroot.appendChild(RightIntrinsics);
RightIntrinsics.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“RightIntrinsics”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
RightIntrinsics.appendChild(rows);
% 在二级子节点“RightIntrinsics”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
RightIntrinsics.appendChild(cols);
% 在二级子节点“RightIntrinsics”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
RightIntrinsics.appendChild(dt);
% 在二级子节点“RightIntrinsics”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3
    for j = 1 : 3
        data.appendChild(xmldoc.createTextNode(sprintf('%f', RightIntrinsicMatrix(i, j))));
        if((i == 3) && (j == 3))
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
    end
end
RightIntrinsics.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“RightDistortionCoeffs”
RightDistortionCoeffs = xmldoc.createElement('RightDistortionCoeffs');
xmlroot.appendChild(RightDistortionCoeffs);
RightDistortionCoeffs.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 5)));
RightDistortionCoeffs.appendChild(rows);
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
RightDistortionCoeffs.appendChild(cols);
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
RightDistortionCoeffs.appendChild(dt);
% 在二级子节点“RightDistortionCoeffs”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 5
        data.appendChild(xmldoc.createTextNode(sprintf('%f', RightDistCoeffMatrix(1, k))));
        if(k == 5)
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
end
RightDistortionCoeffs.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“Translation”
Translation = xmldoc.createElement('Translation');
xmlroot.appendChild(Translation);
Translation.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Translation”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Translation.appendChild(rows);
% 在二级子节点“Translation”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 1)));
Translation.appendChild(cols);
% 在二级子节点“Translation”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Translation.appendChild(dt);
% 在二级子节点“Translation”下生成三级子节点“data”
data = xmldoc.createElement('data');
for k = 1 : 3
        data.appendChild(xmldoc.createTextNode(sprintf('%f',TranslationMatrix(1, k))));
        if(k == 3)
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
end
Translation.appendChild(data);

%% 在根节点“opencv_storage”下生成二级子节点“Rotation”
Rotation = xmldoc.createElement('Rotation');
xmlroot.appendChild(Rotation);
Rotation.setAttribute('type_id', 'opencv-matrix');
% 在二级子节点“Rotation”下生成三级子节点“rows”
rows = xmldoc.createElement('rows');
rows.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Rotation.appendChild(rows);
% 在二级子节点“Rotation”下生成三级子节点“cols”
cols = xmldoc.createElement('cols');
cols.appendChild(xmldoc.createTextNode(sprintf('%d', 3)));
Rotation.appendChild(cols);
% 在二级子节点“Rotation”下生成三级子节点“dt”
dt = xmldoc.createElement('dt');
dt.appendChild(xmldoc.createTextNode(sprintf('%s', 'd')));
Rotation.appendChild(dt);
% 在二级子节点“Rotation”下生成三级子节点“data”
data = xmldoc.createElement('data');
for i = 1 : 3
    for j = 1 : 3
        data.appendChild(xmldoc.createTextNode(sprintf('%f', RotationMatrix(i, j))));
        if((i == 3) && (j == 3))
            break;
        end
        data.appendChild(xmldoc.createTextNode(sprintf('%s', ' ')));    
    end
end
Rotation.appendChild(data);

str = strcat('BinoCalibration', '.xml');
xmlwrite(str, xmldoc);

3 Matlab R2018b

单、双目标定同Matlab R2015a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值