主要内容

cameraIntrinsicsFromOpenCV

转换相机内部参数从OpenCV到MATLAB

描述

例子

intrinsic= cameraIntrinsicsFromOpenCV (intrinsicMatrixdistortionCoefficients图象尺寸)将输入参数指定的OpenCV intrinsic转换为MATLAB®cameraIntrinsics对象intrinsic

OpenCV空间坐标系指定左上角像素中心为(0,0),而MATLAB空间坐标系指定像素中心为(1, - 1).的cameraIntrinsicsFromOpenCV函数通过对两个函数都加1来补偿这个差异x而且y-转换后的主点的值。

OpenCV intrinsic不能转换为MATLABcameraIntrinsics对象时:

  • OpenCV针孔相机模型使用了超过5个失真系数。

  • 采用OpenCV鱼眼模型。

在这些情况下,您可以使用相机校准器应用程序。

例子

全部折叠

在工作空间中定义OpenCV相机的内在参数。

intrinsicMatrix = [729.4644 0 570.6455;0 728.8196 346.0108;0 0 1];扭曲系数= [-0.4262 0.5460 0.0038 -0.0051 -0.6176];

定义相机返回的图像大小。

imageSize = [712 1072];

将内部参数从OpenCV转换为MATLAB格式。

intrinsic = cameraIntrinsicsFromOpenCVdistortionCoefficients、图象尺寸);

加载图像以消除扭曲。

文件名= fullfile(toolboxdir(“愿景”),“visiondata”“校准”“单一”“image01.jpg”);I = imread(文件名);

还原图像并显示结果。

J = undistortion timage (I,intrinsic);imshowpair (I, J,“蒙太奇”);标题(原始图像(左)与修正图像(右));

图中包含一个轴对象。标题为Original Image(左)和Corrected Image(右)的坐标轴对象包含一个Image类型的对象。

ROS摄像机校准包使用OpenCV相机校准工具[1]估计相机固有参数。在ROS中校准相机后,可以使用摄像机标定解析器ROS。使用带有计算机视觉工具箱™功能的校准相机,例如undistortImage,您必须从YAML文件中读取相机参数,然后将它们转换为cameraIntrinsics对象使用cameraIntrinsicsFromOpenCV

注意:cameraIntrinsicsFromOpenCV函数支持仅为那些使金宝app用ROS铅锤变形模型。

从ROS YAML文件读取相机内部参数

读取相机参数存储在cameraParams.yaml使用helper函数helperReadYAML

intrinsicsParams = helpreadyaml (“cameraParams.yaml”);

创建cameraIntrinsics对象使用cameraIntrinsicsFromOpenCV

使用cameraIntrinsicsFromOpenCV函数创建cameraIntrinsics对象从相机矩阵和失真系数。

imageSize = [intrinsicsParams.]image_height intrinsicsParams.image_width];intrinsicMatrix = intrinsicsParams.camera_matrix;扭曲系数= intrinsicsParams.distortion_coefficients;intrinsicsObj = cameraIntrinsicsFromOpenCV(intrinsicMatrix,distortionCoefficients,imageSize);

Undistort形象

使用导入的相机intrinsicundistortImage校正使用校准相机捕捉到的图像。

加载捕获的图像。imageName = fullfile(toolboxdir(“愿景”),“visiondata”“校准”“立体”“左”“left01.png”);I = imread(imageName);还原图像。J = undistortion timage (I,intrinsicsObj,“OutputView”“全部”);显示结果。图蒙太奇({I, J})

图中包含一个轴对象。axis对象包含一个image类型的对象。

金宝app支持功能

helperReadYAML

helperReadYAML函数从ROS导出的YAML输入文件中读取单眼相机参数。

函数cameraParams = helperReadYAML(文件名)% helperReadYAML读取一个ROS YAML文件filename,并返回一个结构image_width, image_height, camera_name,% camera_matrix,扭曲模型,扭曲系数,% rectification_matrix和projection_matrix。这些字段被存储在YAML文件中的%与它们的值分隔在不同的行中。F = fopen(文件名,“r”);stringFields = {“camera_name”“distortion_model”};~feof(f) [name,value,isEmptyLine] = helperReadYAMLLine(f);如果isEmptyLine继续结束如果~ isempty(值)将除已知字符串外的所有值转换为数字%的领域。如果~any(contains(name, stringFields)) value = str2num(value);% #好吧结束其他的ROS YAML文件中的空值表示在%即将到来的线路。从接下来的行中读出矩阵。value = helperReadYAMLMatrix(f);结束存储后处理值。cameraParams.(name) = value;结束文件关闭(f);结束

helperReadYAMLMatrix

helperReadYAMLMatrix函数读取ROS YAML文件中矩阵的行、列和数据字段。

函数矩阵= helperReadYAMLMatrix(f)% helperReadYAMLMatrix从ROS YAML文件读取矩阵。一个矩阵一个ROS YAML文件有三个字段:行、列和数据。行和col%表示矩阵大小。数据是一个连续数组的矩阵%按行长顺序排列的元素。这个助手函数假设存在一个矩阵的所有三个字段的%以返回正确的矩阵。numRows = 0;numCols = 0;数据= [];读取numRows, numCols和矩阵数据。~feof(f) [name,value,isEmptyLine] = helperReadYAMLLine(f);如果isEmptyLine继续结束开关的名字情况下“行”numRows = str2num(value);% #好吧情况下“关口”numCols = str2num(value);% #好吧情况下“数据”数据= str2num(值);% #好吧终止while循环,因为数据是最后一个ROS YAML文件中矩阵的%字段。打破否则%终止while循环,如果任何其他字段%。打破结束结束如果数值(data) == numRows*numCols使用行长顺序重塑矩阵。矩阵=重塑(数据,[numCols numRows])';结束结束

helperReadYAMLLine

helperReadYAMLLine函数读取ROS YAML文件的一行。

函数[name,value,isEmptyLine] = helperReadYAMLLine(f)从文件中读取行。Line = fgetl(f);修饰开头和结尾的空格。Line = strtrim(Line);如果Isempty (line) || line(1)==“#”空行或注释。name =;值=;isEmptyLine = true;其他的%拆分行以获得名称和值。C = strsplit(line,“:”);断言(长度(c) = = 2,“意外的文件格式”) name = c{1};值= strtrim(c{2});修剪前导空格。isEmptyLine = false;结束结束

参考文献

[1]http://wiki.ros.org/camera_calibration

输入参数

全部折叠

来自OpenCV的相机固有矩阵,指定为3 × 3矩阵的形式:

f x 0 c x 0 f y c y 0 0 1

在哪里外汇而且财政年度焦距在x而且y-方向,及(残雪,cy)是OpenCV中的主要点。

来自OpenCV的相机径向和切向畸变系数,指定为形式为[k1k2p1p2k3].的价值k1k2,k3描述径向畸变和p1而且p2描述在OpenCV中指定的切向失真。

图像大小,指定为2元素向量,格式为[mrowsncols].

输出参数

全部折叠

相机内部参数,返回为cameraIntrinsics对象。

版本历史

R2021b中引入