exponenta event banner

estimateLidarCameraTransform

Оценка жесткого преобразования из лидарного датчика в камеру

Описание

tform = estimateLidarCameraTransform(ptCloudPlanes,imageCorners3d) оценивает преобразование между лидарным сенсором и камерой, используя параметры калибровочной схемы шашки, извлеченные из каждого сенсора.

[tform,errors] = estimateLidarCameraTransform(___) возвращает неточность оценки матрицы преобразования errors с использованием входных аргументов из предыдущего синтаксиса.

пример

[___] = estimateLidarCameraTransform(___,Name,Value) указывает параметры, использующие один или несколько аргументов пары имя-значение в дополнение к любой комбинации аргументов в предыдущих синтаксисах. Например, 'Verbose',true устанавливает функцию для отображения хода выполнения.

Примеры

свернуть все

Оцените жесткое преобразование из лидарного датчика в камеру, используя данные, полученные от лидарного датчика и параметры калибровки камеры. Выполните следующие три действия:

  1. Загрузите данные в рабочую область.

  2. Извлеките требуемые элементы из изображений и данных облака точек.

  3. Оцените жесткое преобразование, используя извлеченные элементы.

Загрузить данные

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

imageDataPath = fullfile(toolboxdir('lidar'),'lidardata',...
    'lcc','vlp16','images');
imds = imageDatastore(imageDataPath);
imageFileNames = imds.Files;
ptCloudFilePath = fullfile(toolboxdir('lidar'),'lidardata',...
'lcc','vlp16','pointCloud');
pcds = fileDatastore(ptCloudFilePath,'ReadFcn',@pcread);
pcFileNames = pcds.Files;

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

cameraIntrinsicFile = fullfile(imageDataPath,'calibration.mat');
intrinsic = load(cameraIntrinsicFile);

Извлечение элементов

Укажите размер шашечных квадратов в миллиметрах.

squareSize = 81;

Оцените угловые координаты шахматной доски для изображений.

[imageCorners3d,planeDimension,imagesUsed] = estimateCheckerboardCorners3d( ...
    imageFileNames,intrinsic.cameraParams,squareSize);

Фильтрация облаков точек на основе используемых изображений.

pcFileNames = pcFileNames(imagesUsed);

Определение плоскостей шахматной доски в облаках отфильтрованных точек с помощью параметров плоскости planeDimension.

[lidarCheckerboardPlanes,framesUsed] = detectRectangularPlanePoints( ...
pcFileNames,planeDimension,'RemoveGround',true);

Извлеките изображения, шашечные углы и облака точек, в которых были обнаружены элементы.

imagFileNames = imageFileNames(imagesUsed);
imageFileNames = imageFileNames(framesUsed);
pcFileNames = pcFileNames(framesUsed);
imageCorners3d = imageCorners3d(:,:,framesUsed);

Оценка трансформации

Оцените преобразование с помощью плоскостей шашки из облаков точек и 3-D угловых точек шашки из изображений.

[tform,errors] = estimateLidarCameraTransform(lidarCheckerboardPlanes, ...
imageCorners3d,'CameraIntrinsic',intrinsic.cameraParams);

Отображение ошибок перемещения, поворота и репроекции в виде гистограмм.

figure
bar(errors.TranslationError)
xlabel('Frame Number')
title('Translation Error (meters)')

Figure contains an axes. The axes with title Translation Error (meters) contains an object of type bar.

figure
bar(errors.RotationError)
xlabel('Frame Number')
title('Rotation Error (degrees)')

Figure contains an axes. The axes with title Rotation Error (degrees) contains an object of type bar.

figure
bar(errors.ReprojectionError)
xlabel('Frame Number')
title('Reprojection Error (pixels)')

Figure contains an axes. The axes with title Reprojection Error (pixels) contains an object of type bar.

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

свернуть все

Секционированные плоскости шашки, указанные как pointCloud объект или P-by-1 массив pointCloud объекты. P - количество точечных облаков. Каждый pointCloud объект должен содержать точки, представляющие шашечную (прямоугольную) плоскость.

P должен быть равным для обоих ptCloudPlanes и imageCorners3d аргументы. Это означает, что количество облаков точек и количество изображений, используемых для обнаружения, также должно быть равным.

3-D координаты шашечных углов, заданные как матрица 4 на 3 или массив 4-by-3-by-P. P представляет количество изображений с камеры, используемых для обнаружения. Каждая строка канала содержит 3-D координаты в виде [x, y, z] шашечного угла в метрах, извлеченного из соответствующего изображения камеры. P должен быть равным для обоих ptCloudPlanes и imageCorners3d аргументы. Это означает, что количество облаков точек и количество изображений, используемых для обнаружения, также должно быть равным.

Типы данных: single | double

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'Verbose',true устанавливает функцию для отображения хода выполнения.

Углы шахматной доски в лидарной рамке, указанные как разделенная запятыми пара, состоящая из 'Lidar3DCorners' и массив 4-by-3-by-P, где P - количество облаков точек.

Если пользователь указывает шашечные углы в кадре лидара, то функция не вычисляет их внутри.

Типы данных: single | double

Начальное жесткое преобразование, указанное как разделенная запятыми пара, состоящая из 'InitialTransform' и rigid3d объект.

Функция предполагает, что угол поворота между лидарным датчиком и камерой находится в диапазоне [-45 45] вдоль каждой оси. Для любого другого диапазона угла поворота используйте эту пару имя-значение, чтобы задать начальное преобразование для повышения точности функции.

Внутренние параметры камеры, указанные как пара, разделенная запятыми, состоящая из 'CameraIntrinsic' и cameraIntrinsics объект или cameraParameters объект.

Отображение хода выполнения функции, указанной как разделенная запятыми пара, состоящая из 'Verbose' и логический 0 (false) или логическое 1 (true).

Типы данных: logical

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

свернуть все

Lidar к камере жесткое преобразование, возвращенное как rigid3d объект. Возвращаемый объект регистрирует данные облака точек от лидарного датчика к кадру координат камеры.

Неточность оценки матрицы преобразования, возвращенная как структура. Структура содержит эти поля.

  • RotationError - Разница между нормальными углами, определяемыми плоскостями шашки в облаках точек (лидарный кадр) и углами на изображениях (кадр камеры). Функция оценивает плоскость на изображении с помощью угловых координат шахматной доски. Функция возвращает значения ошибок в градусах в виде числового массива P-элементов. P - количество точечных облаков.

  • TranslationError - Разница между координатами центроида плоскостей шашки в облаках точек и координатами на изображениях. Функция возвращает значения ошибок в метрах в виде числового массива P-элементов. P - количество точечных облаков.

Если для функции заданы внутренние параметры камеры с помощью 'CameraIntrinsic' пара имя-значение, то структура содержит это дополнительное поле.

  • ReprojectionError - разность между спроецированными (преобразованными) координатами центроидов плоскостей шашки от точечных облаков и координатами на изображениях. Функция возвращает значения ошибок в пикселях в виде числового массива P-элементов. P - количество точечных облаков.

Типы данных: struct

Представлен в R2020b