You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
exercise_2/colmap-dev/scripts/matlab/read_model.m

168 lines
4.7 KiB

% Copyright (c) 2022, ETH Zurich and UNC Chapel Hill.
% All rights reserved.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are met:
%
% * Redistributions of source code must retain the above copyright
% notice, this list of conditions and the following disclaimer.
%
% * Redistributions in binary form must reproduce the above copyright
% notice, this list of conditions and the following disclaimer in the
% documentation and/or other materials provided with the distribution.
%
% * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
% its contributors may be used to endorse or promote products derived
% from this software without specific prior written permission.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
% POSSIBILITY OF SUCH DAMAGE.
%
% Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
function [cameras, images, points3D] = read_model(path)
% Read COLMAP model from folder, which contains a
% cameras.txt, images.txt, and points3D.txt.
if numel(path) > 0 && path(end) ~= '/'
path = [path '/'];
end
cameras = read_cameras([path 'cameras.txt']);
images = read_images([path 'images.txt']);
points3D = read_points3D([path 'points3D.txt']);
end
function cameras = read_cameras(path)
cameras = containers.Map('KeyType', 'int64', 'ValueType', 'any');
fid = fopen(path);
tline = fgets(fid);
while ischar(tline)
elems = strsplit(tline);
if numel(elems) < 4 || strcmp(elems(1), '#')
tline = fgets(fid);
continue
end
if mod(cameras.Count, 10) == 0
fprintf('Reading camera %d\n', cameras.length);
end
camera = struct;
camera.camera_id = str2num(elems{1});
camera.model = elems{2};
camera.width = str2num(elems{3});
camera.height = str2num(elems{4});
camera.params = zeros(numel(elems) - 5, 1);
for i = 5:numel(elems) - 1
camera.params(i - 4) = str2double(elems{i});
end
cameras(camera.camera_id) = camera;
tline = fgets(fid);
end
fclose(fid);
end
function images = read_images(path)
images = containers.Map('KeyType', 'int64', 'ValueType', 'any');
fid = fopen(path);
tline = fgets(fid);
while ischar(tline)
elems = strsplit(tline);
if numel(elems) < 4 || strcmp(elems(1), '#')
tline = fgets(fid);
continue
end
if mod(images.Count, 10) == 0
fprintf('Reading image %d\n', images.length);
end
image = struct;
image.image_id = str2num(elems{1});
qw = str2double(elems{2});
qx = str2double(elems{3});
qy = str2double(elems{4});
qz = str2double(elems{5});
image.R = quat2rotmat([qw, qx, qy, qz]);
tx = str2double(elems{6});
ty = str2double(elems{7});
tz = str2double(elems{8});
image.t = [tx; ty; tz];
image.camera_id = str2num(elems{9});
image.name = elems{10};
tline = fgets(fid);
elems = sscanf(tline, '%f');
elems = reshape(elems, [3, numel(elems) / 3]);
image.xys = elems(1:2,:)';
image.point3D_ids = elems(3,:)';
images(image.image_id) = image;
tline = fgets(fid);
end
fclose(fid);
end
function points3D = read_points3D(path)
points3D = containers.Map('KeyType', 'int64', 'ValueType', 'any');
fid = fopen(path);
tline = fgets(fid);
while ischar(tline)
if numel(tline) == 0 || strcmp(tline(1), '#')
tline = fgets(fid);
continue;
end
elems = sscanf(tline, '%f');
if numel(elems) == 0
tline = fgets(fid);
continue;
end
if mod(points3D.Count, 1000) == 0
fprintf('Reading point %d\n', points3D.length);
end
point = struct;
point.point3D_id = int64(elems(1));
point.xyz = elems(2:4);
point.rgb = uint8(elems(5:7));
point.error = elems(8);
point.track = int64(elems(9:end));
point.track = reshape(point.track, [2, numel(point.track) / 2])';
point.track(:,2) = point.track(:,2) + 1;
points3D(point.point3D_id) = point;
tline = fgets(fid);
end
fclose(fid);
end