Как я могу воспроизвести этот кубоидальный график в MATLAB? - PullRequest
3 голосов
/ 02 сентября 2010

Я снял некоторые кадры видео и хотел бы создать из них кубоид, как на следующем примере изображения:

alt text

Мне было интересно, существует ли функция MATLAB для создания такого графика?

1 Ответ

2 голосов
/ 02 сентября 2010

Непонятно, в каком формате ваши видеокадры для начала, поэтому я предполагаю, что они загружены в MATLAB как структурный массив кадров фильма (как описано здесь ). Я создам пример данных фильма (одно изображение повторяется 200 раз), чтобы сначала показать вам, как вы можете загрузить первый кадр в изображение, а также создать изображение из верхних и боковых краев всех ваших кадров (для использования в качестве верхней и боковых граней кубоида):

M = repmat(im2frame(imread('peppers.png')),1,200);  %# Sample movie data

nFrames = numel(M);                  %# The number of frames
face1 = frame2im(M(1));              %# Get the image for the front face
[R,C,D] = size(face1);               %# Get the dimensions of the image
face2 = zeros(R,nFrames,3,'uint8');  %# Initialize the image for the side face
face3 = zeros(nFrames,C,3,'uint8');  %# Initialize the image for the top face

for k = 1:nFrames               %# Loop over the frames
  img = frame2im(M(k));         %# Get the image for the current frame
  face2(:,k,:) = img(:,end,:);  %# Copy the side edge to the side face image
  face3(k,:,:) = img(1,:,:);    %# Copy the top edge to the top face image
end

В приведенном выше коде предполагается, что кадры фильма RGB-изображений , а не проиндексированных изображений . Если они являются индексированными изображениями, вам необходимо получить дополнительный аргумент цветовой карты из функции FRAME2IM , а затем использовать его для преобразования изображения в изображение RGB с помощью функции IND2RGB .

Далее, вы можете построить каждую сторону куба как поверхность с текстурой, используя функцию SURF :

offset = nFrames/sqrt(2);          %# The offset in pixels between the back
                                   %#   corners and front corners of the
                                   %#   displayed cuboid
surf([0 C; 0 C],...                %# Plot the front face
     [R R; 0 0],...
     [0 0; 0 0],...
     'FaceColor','texturemap',...
     'CData',face1);
hold on;                           %# Add to the existing plot
surf([C C+offset; C C+offset],...  %# Plot the side face
     [R R+offset; 0 offset],...
     [0 0; 0 0],...
     'FaceColor','texturemap',...
     'CData',face2);
surf([0 C; offset C+offset],...    %# Plot the top face
     [R R; R+offset R+offset],...
     [0 0; 0 0],...
     'FaceColor','texturemap',...
     'CData',face3);
axis equal                    %# Make the scale on the x and y axes equal
view(2);                      %# Change the camera view
axis off                      %# Turn off display of the axes
set(gcf,'Color','w'...        %# Scale the figure up
    'Position',[50 50 C+offset+20 R+offset+20]);
set(gca,'Units','pixels',...  %# Scale the axes up
    'Position',[10 10 C+offset R+offset]);

И вот результирующая цифра:

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...