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 объект или M элемент cameraIntrinsics объекты. M - количество положений камеры. Когда все изображения будут захвачены одной и той же камерой, задайте один cameraIntrinsics объект. Когда изображения захватываются различными камерами, задайте вектор.

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

свернуть все

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

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

Ошибки репроекции, возвращенные как N-вектор. Чтобы вычислить ошибки репроекции, сначала функция проецирует каждый мир, указывая назад на каждое изображение. Затем в каждом изображении функция вычисляет расстояние между обнаруженной и перепроектированной точками. Каждый элемент reprojectionErrors выходы - это средняя ошибка репроекции для соответствующей мировой точки в 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-на-1 логический вектор. Действительные точки, обозначаемые как логическое 1 (true), расположены перед камерами. Недопустимые точки, обозначаемые как логические 0 (false), расположены за камерами.

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

Совет

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

Ссылки

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

Введенный в R2016a