只有在MATLAB中移动了一定距离时才绘制对象

时间:2014-09-04 22:42:55

标签: matlab

我的代码用于绘制3D散点图中的对象。有些物体在移动,所以我有一个颜色标尺来显示哪些物体比其他物体移动得更远。有没有办法我只能显示移动了一定距离的物体,而忽略那些没有移动的物体(即它们不会出现在地块上)?

这是我写的代码:

filename= 'testing.gif'
FigHandle = figure('Position', [50, -30, 1000, 800]);

for i=1:1001      
    s=1;
    scatter3(am.data(:,3,i),am.data(:,4,i),am.data(:,5,i),s,am.data(:,6,i))
    colorbar
    caxis([0,2.863])
    % axis([0 50 0 50 0 40]);
    T(i)=getframe
end

1 个答案:

答案 0 :(得分:1)

根据您的评论,您希望比较位移与初始位置。这些已经封装在数据的第6列中。如果没有超过阈值,您可以将这些坐标标记为NaN,这样它们就不会显示在图上。换句话说,给定阈值thresh(在您的评论中,这是2.863),请执行以下操作:

filename= 'testing.gif'
FigHandle = figure('Position', [50, -30, 1000, 800]);
s = 1;

thresh = 2.863; %// Adjust if necessary

for i = 1:1001
    currentCoords = am.data(:,3:6,i); %// Get current co-ordinates
    %// Find distance between these co-ordinates and the initial ones
    %// that don't pass the threshold and set to NaN
    loc = currentCoords(:,4) <= thresh;
    currentCoords(loc,:) = NaN;

    %// Now plot the data
    scatter3(currentCoords(:,1), currentCoords(:,2) currentCoords(:,3), ...
             s, currentCoords(:,4));

    colorbar;
    caxis([0,2.863]);
    axis([0 50 0 50 0 50]); %// Restrict axes to ensure they don't change
                            %// when plotting each frame
    T(i)=getframe;
end

编辑 - 2014年9月5日

现在您已经抓取了每个散点图的帧,您希望将这些帧写入文件。使用VideoWriter类可以很容易地完成。您只需设置视频编写器,它就会采用frame结构。您已使用T变量收集了这些内容。因此,您需要做的下一件事是设置视频的特征,例如您要使用的编解码器,帧速率等等。您可以创建一个像这样的视频编写器:

filename_video = 'out.mp4'; %// or 'out.avi';
codec_name = 'MPEG-4';
videoWriter = VideoWriter(filename_video, codec_name);
videoWriter.FrameRate = 20; %// Set frame rate here
videoWriter.Quality = 100; %// Set quality of each frame here

您需要阅读有关可以编写文件的MATLAB支持哪些编解码器的文档,但MPEG-4非常受欢迎,它适用于Windows 7系统以及Mac OS X 10.7或更高版本。如果要保存在AVI容器中,当然可以这样做,但请确保为此目的指定了正确的编解码器。上面代码的前两行指定了要保存的视频的输出文件名,以及要使用的编解码器。设置视频编写器后的下三行,如果使用有损编解码器,则设置帧速率和每帧的质量。对于无损,质量设置将不会做任何事情。您可以设置一大堆其他参数来自定义视频的外观,但我会留给您阅读有关此问题的文档。要使基本视频正常工作,以上就足够了。

接下来需要做的是打开文件进行写入,然后遍历T中的每个帧并将帧写入此视频。完成后,关闭视频。换句话说,你接下来要这样做:

open(videoWriter); %// Open the video writer
for idx = 1 : numel(T)  %// Write the frames to file
    writeVideo(videoWriter, T(idx));
end
close(videoWriter); %// Close the video writer

如果一切顺利,您会看到保存.mp4(或.avi)文件的位置,您可以使用任何传统的视频查看软件查看该文件(例如{ {3}})。   我不能强调你需要打开文件进行写作,当你完成后,你关闭文件。在您关闭文件之前,不会保存任何视频。

祝你好运!