Я пытаюсь реализовать алгоритм восстановления трехмерных координат с известным Z-компонентом по координатам 2D-изображения.
Используя приложение калибровки камеры Matlab, я рассчитал внутренние параметры.Я использовал те и 4 точки на рисунке, которые я знаю, координаты реального мира, чтобы получить внешние параметры.
Затем я использовал метод, предложенный в исходной записи переполнения стека для 3d реконструкции:
После получения всех матриц это уравнение, которое может помочь мне преобразовать точку изображения в координаты Вольра:
гдеM - cameraMatrix, R - вращение Matrix, t - tvec, а s - неизвестно.Zconst представляет высоту, где находится оранжевый шар, в этом примере это 285 мм.Итак, сначала мне нужно решить предыдущее уравнение, чтобы получить «s», и после того, как я могу узнать координаты X и Y, выбрав точку изображения:
%% 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) :
Принимая во внимание, что реконструкция выглядит следующим образом:
Как видите, 4 фиксированные точки, используемые для вычисления внешних параметров, отображаются правильно, но восстановленные находятся в неправильных точках.
Чтовызывает эту ошибку и как ее исправить?