Заголовок сообщения: Функция mutiviewTriangulate в MATLAB, 3D Модель из 2Д точек
Добавлено: 18 окт 2023, 22:55
Мастер
Зарегистрирован: 07 ноя 2015, 02:22 Сообщений: 210 Cпасибо сказано: 67 Спасибо получено: 2 раз в 2 сообщениях Очков репутации: 1
Привет всем, никак не разберусь что хочет функция mutiviewTriangulate . То что я пытаюсь сделать:
В общем есть изображения (12 штук) на каждом изображении есть 2д координаты точек каркаса (это сателлит), грубо говоря 8 2D (x,y) точек образуют параллелепипед плюс еще 3 точки (антенны). Изображения сделаны с разных позиций, есть расположение камеры для каждой картинки и intrinsic matrix камеры. Точки всегда в одном и томже порядке.
Вот параметры камеры:
% Create a camera intrinsics object K = [ 2988.5795163815555, 0, 960; 0, 2988.3401159176124, 600; 0, 0, 1 ];
Далее идут 2Д координаты для 11 точек из 12 изображений, каждый массив (картинка) имеет 11 2Д точек:
Далее идут позиции камеры относительно объекта для каждого изображения (всё консистентно landmarks_2d). q это quaternion, r это translation vector.. q в таком формате: [w,x,y,z] Поместил каждую pose в такой struct:
Не могу никак разобраться как подготовить данные для этой функции.
pointTracks делаю так:
% Number of images and landmarks numImages = length(landmarks_2d); numLandmarks = size(landmarks_2d{1}, 1);
% Array of pointTrack objects tracks(numLandmarks) = pointTrack();
% View IDs for all 12 images viewIDs = 1:numImages;
% Loop through each of the 11 landmarks for i = 1:numLandmarks % Extract the i-th landmark's coordinates across all 12 images points = cell2mat(cellfun(@(c) c(i, , landmarks_2d, 'UniformOutput', false));
% Create pointTrack object tracks(i) = pointTrack(viewIDs, points); end % The 'tracks' array now contains 11 pointTrack objects, each with points across 12 views.
Че то я тут не правильно сделал, мне кажется viewIDs = [1 2 3 4 5 6 7 8 9 10 11 12] должно быть. И того, ошибка в том что я не правильно сделал cameraPoses таблицу. Начинаю исправлять в итоге еще больше ошибок. MATLAB использую первый раз.
Обновление, ошибок нету а модель не точная: код без ошибок:
▼
% Create a camera intrinsics object K = [ 2988.5795163815555, 0, 960; 0, 2988.3401159176124, 600; 0, 0, 1 ];
%-------------------->-==pointTracks==-<----------------------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Number of images and landmarks numImages = length(landmarks_2d); numLandmarks = size(landmarks_2d{1}, 1);
% Array of pointTrack objects tracks(numLandmarks) = pointTrack();
% View IDs for all 12 images viewIDs = 1:numImages;
% Loop through each of the 11 landmarks for i = 1:numLandmarks % Extract the i-th landmark's coordinates across all 12 images points = cell2mat(cellfun(@(c) c(i, , landmarks_2d, 'UniformOutput', false));
% Create pointTrack object tracks(i) = pointTrack(viewIDs, points); end % The 'tracks' array now contains 11 pointTrack objects, each with points across 12 views.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %-------------------->-==cameraPoses==-<----------------------------------- % Assuming you have the poses array from earlier: numPoses = numel(poses); rigidTransforms = cell(1, numPoses);
for idx = 1:numPoses normalized_quaternion = poses{idx}.q / norm(poses{idx}.q); % Normalize the quaternion R = quat2rotm(normalized_quaternion); t = poses{idx}.r; rigidTransforms{idx} = rigid3d(R, t); end
% Compute projection matrices for each image P = {}; for i = 1:length(poses) R = quat2rot(poses(i).q); t = poses(i).r'; Rt = [R, t]; P{i} = K * Rt; end
% Triangulate points between consecutive image pairs landmarks_3d = {}; for i = 1:length(landmarks_2d)-1 points1 = landmarks_2d{i}; points2 = landmarks_2d{i+1}; X = zeros(size(points1, 1), 3); % Corrected here
for j = 1:size(points1, 1) X(j,:) = triangulate(points1(j, , points2(j, , P{i}, P{i+1}); end
landmarks_3d{i} = X; end
% Accumulate the 3D coordinates for each landmark accumulated_landmarks = zeros(size(landmarks_3d{1}, 1), 3);
for i = 1:length(landmarks_3d) accumulated_landmarks = accumulated_landmarks + landmarks_3d{i}; end
% Compute the mean 3D coordinates for each landmark mean_landmarks = accumulated_landmarks / length(landmarks_3d);
disp(mean_landmarks); % This will display an 11x3 array
% Now, landmarks_3d contains the 3D coordinates for each image pair
% Convert quaternion to rotation matrix function R = quat2rot(q) x = q(2); y = q(3); z = q(4); w = q(1); R = [ 1-2*y^2-2*z^2, 2*x*y-2*z*w, 2*x*z+2*y*w; 2*x*y+2*z*w, 1-2*x^2-2*z^2, 2*y*z-2*x*w; 2*x*z-2*y*w, 2*y*z+2*x*w, 1-2*x^2-2*y^2 ]; end
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения