Реализация алгоритма 3D реконструкции не работает - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь реализовать алгоритм восстановления трехмерных координат с известным Z-компонентом по координатам 2D-изображения.

Используя приложение калибровки камеры Matlab, я рассчитал внутренние параметры.Я использовал те и 4 точки на рисунке, которые я знаю, координаты реального мира, чтобы получить внешние параметры.

Затем я использовал метод, предложенный в исходной записи переполнения стека для 3d реконструкции:

После получения всех матриц это уравнение, которое может помочь мне преобразовать точку изображения в координаты Вольра:

pinhole model equation

гдеM - cameraMatrix, R - вращение Matrix, t - tvec, а s - неизвестно.Zconst представляет высоту, где находится оранжевый шар, в этом примере это 285 мм.Итак, сначала мне нужно решить предыдущее уравнение, чтобы получить «s», и после того, как я могу узнать координаты X и Y, выбрав точку изображения:

rearranged pinhole model equation

%% Intrinsic camera parameters
cameraData = load("CameraParams.mat");
cameraParams = cameraData.cameraParams;
intrinsicMatrix = cameraParams.IntrinsicMatrix';

%% Points with known world coordinates
imagePoints = [224 92; 963 81; 200 653; 988 650];
worldPoints = [0   0;  114 0;  0   85;  114 85];

%% Points with unknown world xy-coordinates
unknownPoints = [416 280; 773 275; 414 479; 778 477];
zOffset = 0;

%% Extrinsic camera parameters
[rotationMatrix, translationVector] = extrinsics(imagePoints, worldPoints, cameraParams);

%% Transform image to world coordinates
results = zeros(length(unknownPoints), 3);
A = inv(intrinsicMatrix * rotationMatrix);
for i = 1:length(unknownPoints)
    P = [unknownPoints(i,:) 1]';
    AP = A * P;
    At = A * translationVector';
    s = (zOffset + At(3)) / AP(3);

    results(i,:) = s * AP - At;
end

%% Visualization
allWorldPoints = [[worldPoints zeros(size(worldPoints, 1), 1)]; results];
allImagePoints = [imagePoints; unknownPoints];
[orientation, location] = extrinsicsToCameraPose(rotationMatrix, translationVector);

figure;
scatter(allImagePoints(:,1), allImagePoints(:,2));

figure;
plotCamera("Location", location, "Orientation", orientation, "Size", 20);
hold on;
pcshow(allWorldPoints, [0 0 0], "VerticalAxisDir", "down", "MarkerSize", 40);

Исходное изображение выглядит следующим образом (перевернуто направление y) : original picture

Принимая во внимание, что реконструкция выглядит следующим образом:3d reconstruction

Как видите, 4 фиксированные точки, используемые для вычисления внешних параметров, отображаются правильно, но восстановленные находятся в неправильных точках.

Чтовызывает эту ошибку и как ее исправить?

...