2010-09-02 1 views
3

я бросил некоторые кадры из видео и хотели бы произвести кубоид из них, как в следующем примере изображения:Как я могу воспроизвести этот кубический участок в MATLAB?

alt text

мне было интересно, если существует функция MATLAB, чтобы сделать такой сюжет ?

+0

Есть конкурирующие определения «кубоида». Можете быть более конкретными? –

+0

Как ваши видеокадры хранятся в MATLAB? Являются ли они в структурном массиве видеокадров (с полями '' cdata'' и '' colormap '') или 4-мерным массивом (например, набором трехмерных изображений RGB, объединенных по четвертому измерению) или некоторых в другом формате? – gnovice

ответ

2

Непонятно, в каком формате используются ваши видеокадры, поэтому я предполагаю, что они загружены в MATLAB как структурный массив кадров фильма (как описано here). Я создам некоторые примеры данных фильма (одно изображение повторяется 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 images, в отличие от indexed images. Если они являются проиндексированными изображениями, вам нужно будет получить дополнительный аргумент colormap из функции 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

+0

Спасибо gnovice. Это именно то, что я искал! С наилучшими пожеланиями – Javier