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 object. The axes object 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 object. The axes object 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 object. The axes object 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 имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

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

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

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

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

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

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

Типы данных: логический

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

свернуть все

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

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

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

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

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

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

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

Введенный в R2020b