cameraIntrinsicsFromOpenCV

Преобразуйте параметры внутреннего параметра камеры от OpenCV до MATLAB

Описание

пример

intrinsics = cameraIntrinsicsFromOpenCV(intrinsicMatrix,distortionCoefficients,imageSize) преобразует внутренние параметры OpenCV, заданные входными параметрами, в MATLAB® cameraIntrinsics объект intrinsics.

Система пространственной координаты OpenCV задает верхний левый пиксельный центр в (0,0), тогда как система пространственной координаты MATLAB задает пиксельный центр в (1,1). cameraIntrinsicsFromOpenCV функция компенсирует это различие путем добавления 1 к обоим из x и y - значения для конвертированной основной точки.

Внутренние параметры OpenCV не могут быть преобразованы в cameraIntrinsics MATLAB объект, когда:

  • Модель камеры с точечной диафрагмой OpenCV использует больше чем пять коэффициентов искажения.

  • Модель подозрительного взгляда OpenCV используется.

В этих случаях можно перекалибровать стереофотоаппарат с помощью приложения Camera Calibrator.

Примеры

свернуть все

Задайте параметры внутреннего параметра камеры OpenCV в рабочей области.

intrinsicMatrix = [729.4644    0       570.6455;
                     0       728.8196  346.0108;
                     0         0         1  ];
distortionCoefficients = [-0.4262  0.5460  0.0038  -0.0051  -0.6176];

Задайте размер изображения, возвращенный камерой.

imageSize = [712 1072];

Преобразуйте внутренние параметры от OpenCV до формата MATLAB.

intrinsics = cameraIntrinsicsFromOpenCV(intrinsicMatrix, ...
                                       distortionCoefficients,imageSize);

Загрузите изображение, чтобы не исказить.

filename = fullfile(toolboxdir("vision"),"visiondata","calibration", ...
                        "mono","image01.jpg");
I = imread(filename);

Не исказите изображение и diplay результаты.

J = undistortImage(I,intrinsics);
imshowpair(I,J,"montage");
title("Original Image (left) vs. Corrected Image (right)");

Figure contains an axes object. The axes object with title Original Image (left) vs. Corrected Image (right) contains an object of type image.

Пакет калибровки фотоаппарата ROS оценивает параметры внутреннего параметра камеры с помощью инструментов калибровки фотоаппарата OpenCV [1]. После калибровки камеры в ROS можно импортировать его внутренние параметры к файлу YAML с помощью синтаксического анализатора калибровки фотоаппарата в ROS. Использовать калиброванную камеру с функциями Computer Vision Toolbox™, такими как undistortImage, необходимо считать параметры камеры из файла YAML и затем преобразовать их в cameraIntrinsics объект с помощью cameraIntrinsicsFromOpenCV.

Примечание: cameraIntrinsicsFromOpenCV функционируйте поддержки, импортирующие параметры внутреннего параметра камеры только для тех моделей камеры с точечной диафрагмой, которые используют ROS plumb-bob модель искажения.

Считайте параметры внутреннего параметра камеры из файла ROS YAML

Считайте параметры камеры, сохраненные в cameraParams.yaml использование помощника функционирует helperReadYAML.

intrinsicsParams = helperReadYAML('cameraParams.yaml');

Создайте cameraIntrinsics Объект Используя cameraIntrinsicsFromOpenCV

Используйте cameraIntrinsicsFromOpenCV функция, чтобы создать cameraIntrinsics объект из матрицы камеры и коэффициентов искажения.

imageSize = [intrinsicsParams.image_height intrinsicsParams.image_width];
intrinsicMatrix = intrinsicsParams.camera_matrix;
distortionCoefficients = intrinsicsParams.distortion_coefficients;

intrinsicsObj = cameraIntrinsicsFromOpenCV(intrinsicMatrix,distortionCoefficients,imageSize);

Не исказите изображение

Используйте импортированные внутренние параметры камеры с undistortImage не исказить изображение получило использование калиброванной камеры.

% Load the captured image.
imageName = fullfile(toolboxdir('vision'),'visiondata','calibration','stereo','left','left01.png');
I = imread(imageName);

% Undistort the image.
J = undistortImage(I,intrinsicsObj,'OutputView','full');

% Display the result.
figure
montage({I,J})

Figure contains an axes object. The axes object contains an object of type image.

Вспомогательные Функции

helperReadYAML

helperReadYAML функционируйте читает монокулярные параметры камеры из файла входа YAML, который экспортировался от ROS.

function cameraParams = helperReadYAML(filename)
% helperReadYAML reads a ROS YAML file, filename, and returns a structure 
% with these fields: image_width, image_height, camera_name,
% camera_matrix, distortion_model, distortion_coefficients,
% rectification_matrix, and projection_matrix. These fields are stored 
% in the YAML file colon separated from their values in different lines.

    f = fopen(filename,'r');
    stringFields = {'camera_name','distortion_model'};
    
    while ~feof(f)

        [name,value,isEmptyLine] = helperReadYAMLLine(f);
        if isEmptyLine
            continue
        end

        if ~isempty(value)
            % Convert all values to numbers except for known string
            % fields.
            if ~any(contains(name, stringFields))
                value = str2num(value); %#ok
            end
        else
            % An empty value in ROS YAML files indicates a matrix in
            % upcoming lines. Read the matrix from the upcoming lines.
            value = helperReadYAMLMatrix(f);
        end

        % Store post-processed value.
        cameraParams.(name) = value;
    end
    
    fclose(f);
end

helperReadYAMLMatrix

helperReadYAMLMatrix функционируйте читает строки, столбцы и поля данных матрицы в файле ROS YAML.

function matrix = helperReadYAMLMatrix(f)
%   helperReadYAMLMatrix reads a matrix from the ROS YAML file. A matrix in
%   a ROS YAML file has three fields: rows, columns and data. rows and col
%   describe the matrix size. data is a continguous array of the matrix
%   elements in row-major order. This helper function assumes the presence
%   of all three fields of a matrix to return the correct matrix.

    numRows = 0;
    numCols = 0;
    data = [];

    % Read numRows, numCols and matrix data.
    while ~feof(f)
        [name,value,isEmptyLine] = helperReadYAMLLine(f);

        if isEmptyLine
            continue
        end

        switch name
            case 'rows'
                numRows = str2num(value); %#ok
            case 'cols'
                numCols = str2num(value); %#ok
            case 'data'
                data    = str2num(value); %#ok

                % Terminate the while loop as data is the last 
                % field of a matrix in the ROS YAML file.
                break
            otherwise
                % Terminate the while loop if any other field is
                % encountered.
                break
        end
    end

    if numel(data) == numRows*numCols
        % Reshape the matrix using row-major order.
        matrix = reshape(data,[numCols numRows])';
    end
end

helperReadYAMLLine

helperReadYAMLLine функция читает строку файла ROS YAML.

function [name,value,isEmptyLine] = helperReadYAMLLine(f)

    % Read line from file.
    line = fgetl(f); 

    % Trim leading and trailing whitespaces.
    line = strtrim(line);

    if isempty(line) || line(1)=='#'
        % Empty line or comment.
        name = '';
        value = '';
        isEmptyLine = true;
    else
        % Split the line to get name and value.
        c = strsplit(line,':');
        assert(length(c)==2,'Unexpected file format')
        
        name = c{1};
        value = strtrim(c{2}); % Trim leading whitespace.
        isEmptyLine = false;
    end
end

Ссылки

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

Входные параметры

свернуть все

Матрица внутреннего параметра камеры от OpenCV в виде 3х3 матрицы формы:

[fx0cx0fycy001]

где fx и fy являются фокусными расстояниями в x и y - направления и (cx,cy) являются основной точкой в OpenCV.

Камера радиальные и тангенциальные коэффициенты искажения от OpenCV в виде вектора с пятью элементами из формы [k1 k2 p1 p2 k3]. Значения k1, k2 и k3 описывают радиальное искажение, и p1 и p2 описывают тангенциальное искажение, заданное в OpenCV.

Размер изображения в виде вектора с 2 элементами в форме [mrows, ncols].

Выходные аргументы

свернуть все

Параметры внутреннего параметра камеры, возвращенные как cameraIntrinsics объект.

Введенный в R2021b