triangulateMultiview

3-D местоположения неискаженных точек соответствующими через повторные изображения

Описание

пример

xyzPoints = triangulateMultiview(pointTracks,cameraPoses,intrinsics) возвращает местоположения 3-D мировых точек, которые соответствуют точкам, соответствующим через повторные изображения, взятые с калиброванной камерой.

[xyzPoints,reprojectionErrors] = triangulateMultiview(___) дополнительно возвращает N - вектор элемента, reprojectionErrors, это содержит среднюю ошибку перепроекции fo каждая 3-D мировая точка.

Примеры

свернуть все

Загрузите изображения.

imageDir = fullfile(toolboxdir('vision'),'visiondata',...
    'structureFromMotion');
images = imageSet(imageDir);

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

data = load(fullfile(imageDir,'cameraParams.mat'));

Получите параметры внутреннего параметра камеры.

intrinsics = data.cameraParams.Intrinsics;

Вычислите функции первого изображения.

I = rgb2gray(read(images,1));
I = undistortImage(I,intrinsics);
pointsPrev = detectSURFFeatures(I);
[featuresPrev,pointsPrev] = extractFeatures(I,pointsPrev);

Загрузите местоположения камеры и ориентации.

load(fullfile(imageDir,'cameraPoses.mat'));

Создайте объект viewSet.

vSet = viewSet;
vSet = addView(vSet, 1,'Points',pointsPrev,'Orientation',...
    orientations(:,:,1),'Location',locations(1,:));

Вычислите функции и соответствия для остальной части изображений.

for i = 2:images.Count
  I = rgb2gray(read(images, i));
  I = undistortImage(I,intrinsics);
  points = detectSURFFeatures(I);
  [features,points] = extractFeatures(I,points);
  vSet = addView(vSet,i,'Points',points,'Orientation',...
      orientations(:,:,i),'Location',locations(i,:));
  pairsIdx = matchFeatures(featuresPrev,features,'MatchThreshold',5);
  vSet = addConnection(vSet,i-1,i,'Matches',pairsIdx);
  featuresPrev = features;
end

Найдите дорожки точки.

tracks = findTracks(vSet);

Получите положения камеры.

cameraPoses = poses(vSet);

Найдите 3-D мировые точки.

[xyzPoints,errors] = triangulateMultiview(tracks,cameraPoses,intrinsics);
z = xyzPoints(:,3);
idx = errors < 5 & z > 0 & z < 20;
pcshow(xyzPoints(idx, :),'VerticalAxis','y','VerticalAxisDir','down','MarkerSize',30);
hold on
plotCamera(cameraPoses, 'Size', 0.2);
hold off

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

свернуть все

Соответствие с точками через повторные изображения, заданные как N - массив элемента pointTrack объекты. Каждый элемент содержит две или больше точки то соответствие через повторные изображения.

Информация положения камеры, указанная как таблица с тремя столбцами. Таблица содержит столбцы для ViewId, Orientation, и Location. Представление IDs соответствует идентификаторам в pointTracks объект. Задайте ориентации как 3х3 матрицы вращения и местоположения как трехэлементные векторы. Можно получить cameraPoses от viewSet объект при помощи его poses метод.

Внутренние параметры камеры, заданные как скаляр или M - массив элемента cameraIntrinsics объекты. M является количеством положений камеры. Используйте скалярное значение, когда изображения будут получены с помощью той же камеры. Используйте вектор, когда изображения будут получены различными камерами.

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

свернуть все

3-D мировые точки, заданные как N-by-3 массив [x, y, z] координаты.

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

Ошибки перепроекции, возвращенные как N-by-1 вектор. Функциональные проекты каждая мировая точка назад в оба изображения. Затем в каждом изображении, функция вычисляет ошибку перепроекции как расстояние между обнаруженным и повторно спроектированной точкой. reprojectionErrors вектор содержит среднюю ошибку перепроекции для каждой мировой точки.

Советы

Поскольку triangulateMultiview не составляет искажение объектива, можно не исказить изображения прежде, чем обнаружить точки при помощи undistortImage. В качестве альтернативы можно не исказить точки непосредственно с помощью undistortPoints.

Ссылки

[1] Хартли, R. и А. Зиссермен. "Несколько Геометрия Представления в Компьютерном зрении". Издательство Кембриджского университета, p. 312, 2003.

Введенный в R2016a