Матричная матрица проекций Matlab - PullRequest
0 голосов
/ 05 ноября 2018

Я работаю с базой кода, которая использует функцию Matlab trimesh для проецирования 3D-фигур в 2D-изображения. Фрагмент, который делает это:

function h = plotMesh(mesh, style, az, el)
h = trimesh(mesh.F', mesh.V(1,:)', mesh.V(2,:)' ,mesh.V(3,:)', 'FaceColor', 'w', 'EdgeColor', 'none', ...
    'AmbientStrength', 0.3, 'DiffuseStrength', 0.6, 'SpecularStrength', 0.0, 'FaceLighting', 'flat');
set(gcf, 'Color', 'w', 'Renderer', 'OpenGL');
set(gca, 'Projection', 'perspective');    
axis equal;
axis off;
view(az,el);
camlight('HEADLIGHT');

Вышеуказанный фрагмент называется так:

ims = cell(1,length(opts.az));
for i=1:length(opts.az),
    plotMesh(mesh,'solid',opts.az(i),opts.el);
    ims{i} = print('-RGBImage', '-r100');  %in case of an error,you have an old matlab version: comment this line and uncomment the following 2 ones
    %saveas(opts.figHandle, '__temp__.png');
    %ims{i} = imread('__temp__.png');
    if strcmpi(opts.colorMode,'gray'), ims{i} = rgb2gray(ims{i}); end
    ims{i} = resize_im(ims{i}, opts.outputSize, opts.minMargin, opts.maxArea);
end

Приведенная выше структура данных opts инициализируется следующим образом, два параметра - азимут и угол места:

opts.az = [0:30:330];
opts.el = 30;
opts.use_dodecahedron_views = false;
opts.colorMode = 'rgb';
opts.outputSize = 224;
opts.minMargin = 0.1;
opts.maxArea = 0.3;
opts.figHandle = [];

Я, однако, хочу, чтобы отображение [x, y, z] - [xImage, yImage] или фактическая матрица, использованная trimesh для этой проекции, поэтому я Я могу вычислить это отображение самостоятельно. У меня есть дополнительные метки в сетке, связанные с каждым [x, y, z] , и я хочу перенести эти метки в [xImage, yImage] . Я не могу этого сделать, если не знаю явного 3D-2D-отображения. Как мне получить это отображение? Кодовая база, которую я использую, не устанавливает никаких параметров камеры, поэтому используемая матрица присуща Matlab trimesh, я думаю.

Примечание: Mesh - это структура данных со списком граней, вершин и нормалей, которая загружается из файла 'OFF' с помощью этой функции, определенной здесь: https://github.com/suhangpro/mvcnn/blob/abbebe3278fda70a42f62c2432ba6dd2247f072f/utils/loadMesh.m

TLDR; Сетка строится как 2D-проекция с использованием trimesh, а затем строится график. Для каждой координаты [x, y, z] на входе я хочу знать координату [x, y] на выходном изображении, на которое она была отображена.

...