MATLAB。将绘制的线叠加到现有的.avi电影上

时间:2015-06-17 14:36:10

标签: matlab avi

我想将一系列已知坐标作为线条绘制到已知宽度和高度的图形上。然后导入相同高度和宽度的.avi电影,然后将这两个组合起来,使线条覆盖视频。

我一直在寻找谷歌和stackoverflow,但不知道从哪里开始。任何指针都得到了很好的回应。我正在使用Matlab R2015a。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

这是一种方法。代码被评论。我创建了一个虚拟电影,但如果你有一部电影,你可以跳过前几个步骤,如图所示。诀窍是使用hold ondrawnow来正确刷新显示。您可以添加更多行或修改您想要的任何内容。如果不清楚,请询问。

clear
clc
close all

%//================
%// Make video. If you already have one skip this step.
xyloObj = VideoReader('xylophone.mp4');

vidWidth = xyloObj.Width;
vidHeight = xyloObj.Height;

mov = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),...
    'colormap',[]);
%//================
hf = figure;
set(hf,'position',[150 150 vidWidth vidHeight]);

%// Read frames and put into structure to display in an axes.
k = 1;
while hasFrame(xyloObj)
    mov(k).cdata = readFrame(xyloObj);
    k = k+1;
end

%// For animated gif
filename = 'OverlayGif.gif';

NumFrames = k;
hold on
for n = 1:15

    imshow(mov(n).cdata);

    %// Add line. The drawnow is crucial.
    line([round(vidWidth/4) round(3*vidWidth/4)],[round(vidHeight/2) round(vidHeight/2)],'Color',rand(1,3),'LineWidth',4)
    drawnow

    %// Make animated gif (for demo only. You don't need that).
    frame = getframe(1);
    im = frame2im(frame);
    [imind,cm] = rgb2ind(im,256);
    if n == 1;
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append');
    end

end

动画gif中的示例输出。您可以删除用于创建它的for循环的结尾。

希望有所帮助!