exponenta event banner

triangulateMultiview

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

Описание

пример

worldPoints = triangulateMultiview(pointTracks,cameraPoses,intrinsics) возвращает местоположения точек мира 3-D которые соответствуют точкам, сопоставленным с несколькими изображениями, сделанными калиброванными камерами. pointTracks задает массив совпадающих точек. cameraPoses и intrinsics укажите информацию о позе и характеристиках камеры соответственно. Функция не учитывает искажение объектива.

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

[worldPoints,reprojectionErrors,validIndex] = triangulateMultiview(___) дополнительно возвращает индексы действительных и недопустимых точек мира. Допустимые точки расположены перед камерами.

Примеры

свернуть все

Загрузка изображений в рабочую область.

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

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

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

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

intrinsics = data.cameraParams.Intrinsics;

Вычислить элементы для первого изображения.

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

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

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

Создание imageviewset объект.

vSet = imageviewset;
vSet = addView(vSet,1,rigid3d(orientations(:,:,1),locations(1,:)),...
    'Points',pointsPrev);

Вычислите элементы и совпадения для остальных изображений.

for i = 2:images.Count
  I = im2gray(read(images,i));
  I = undistortImage(I,intrinsics);
  points = detectSURFFeatures(I);
  [features,points] = extractFeatures(I,points);
  vSet = addView(vSet,i,rigid3d(orientations(:,:,i), locations(i,:)),...
      'Points',points);
  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

Figure contains an axes. The axes contains 51 objects of type line, text, patch, scatter.

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

свернуть все

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

Информация о позе камеры, заданная как таблица из двух или трех столбцов. Вы можете получить cameraPoses от imageviewset с помощью poses объектная функция.

Таблица из двух столбцов

КолонкаОписание
ViewIDПросмотреть идентификатор в pointTrack , указанный как целое число.
AbsolutePoseАбсолютная поза вида, указанная как rigid3d объект. Вы можете получить AbsolutePose от imageviewset с помощью poses объектная функция.

Таблица из трех столбцов

КолонкаОписание
ViewIDПросмотреть идентификатор в pointTrack , указанный как целое число.
OrientationОриентация камеры, заданная как матрица вращения 3 на 3.
LocationКоординаты расположения камеры, заданные как трехэлементный вектор вида [x, y, z] и представленные в единицах данных родительских осей.

Характеристики камеры, указанные как cameraIntrinsics объект или вектор М-элемента cameraIntrinsics объекты. M - количество поз камеры. Когда все изображения захватываются одной и той же камерой, укажите одну cameraIntrinsics объект. Когда изображения захватываются различными камерами, укажите вектор.

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

свернуть все

3D мировые пункты, возвращенные как матрица N-3. Каждая строка представляет одну 3-D точку мира и имеет вид [x, y, z]. N - количество 3-D мировых очков.

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

Ошибки повторного впрыска, возвращаемые как вектор N-элемента. Чтобы вычислить ошибки репроекции, сначала функция проецирует каждую точку мира обратно в каждое изображение. Затем в каждом изображении функция вычисляет расстояние между обнаруженной и повторно проецируемой точкой. Каждый элемент reprojectionErrors output - средняя ошибка обратного впрыска для соответствующей точки мира в worldPoints выход.Section of a checkerboard showing a point detected in the image a small distance from the 3-D point reprojected into the image. The distance between them is marked as the reprojection error.

Достоверность мировых точек, возвращенная как M-by-1 логический вектор. Допустимые точки, обозначаемые как логические 1 (true), расположены перед камерами. Недопустимые точки, обозначаются как логические 0 (false), расположены за камерами.

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

Совет

Перед обнаружением точек скорректируйте изображения для искажения объектива с помощью undistortImage функция. Кроме того, можно непосредственно отменить искривление точек с помощью undistortPoints функция.

Ссылки

[1] Хартли, Ричард и Эндрю Зиссерман. Геометрия нескольких видов в компьютерном видении. 2-й ред. Кембридж, Великобритания; Нью-Йорк; Издательство Кембриджского университета, 2003 год.

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