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 на 3 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 на 3 байта P, где P количество облаков точек.

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

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

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

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

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

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

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

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

свернуть все

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

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

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

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

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

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

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

Введенный в R2020b