如何在 Matlab 中制作矢量图形视频?
How to have Vector Graphics Video in Matlab?
我想要一个矢量图形视频输出,这样我就可以在 Matlab 2016a 中播放视频时调整 window 的大小。
我希望在图片中具有与 .eps 3 格式相似的特征,但对于视频。
伪代码的一些概述
- 在 10 秒内以 .mat 格式读取图片数据,因此您可以选择可能适用于视频的任何矢量图片格式
- 在
colormap(gray)
中有图形句柄,而不是先将图片存储到 imgRGB
/imgPNG
/... 并进行特定自定义
- 将图形句柄
hFig
添加到列表 signal
- 视频的循环图形句柄
我不确定列表中有很多图形句柄并将它们循环到一个主要图形中。
这可能是不可能的。
我目前使用非矢量化 imgRGB
/imgPNG
/... 的方法我想拒绝,因为调整大小 window 和缩放 [=20= 有几个问题]
imgRGB
是 15x15x3。执行 signal=cat(2,signal,imgRGB);
将信号增加到 15x30x3, ..., 15x15Nx3,这似乎不是存储许多图片的好方法。
伪代码
%% Make vector graphics pictures that are parts of the video
signal=[];
for k=1:3
A=load(filenameMat); % = A.time, A.potential, A.matrix
% TODO convert to some vector form each picture which should work in video too
% I can make N .eps pictures and figure handle to all of them.
% So probably having a list of those figure handles is the way to go.
hFig=figure(); % but not sure if possible with vectorised video play
signal=cat(2,signal,hFig); % pseudo
end
%% Put parts together in the main Figure i.e. video
%
windowWidth = 320;
hFig=figure('Menubar','figure', 'NumberTitle','off', 'Color','k', 'Visible', 'on');
hImg = imshow(signal(:,1:1 + windowWidth,:), ...
'InitialMagnification', 100, 'Border', 'tight');
vid = VideoWriter('signal.avi');
vid.Quality = 100;
vid.FrameRate = 60;
open(vid);
M = size(signal,2);
for k=1:(M - windowWidth)
set(hImg, 'CData', signal(:,k:k + windowWidth,:))
writeVideo(vid, getframe());
end
close(vid);
如何在 Matlab 中输出矢量图形视频?
无法放置 vector graphics into a video. Any video format supported by MATLAB (and any video format I know) is based on raster graphics。编写视频时,您必须接受它是光栅化的。
你的代码还有一个问题,我不明白。您已经从光栅图像 (signal(:,1:1 + windowWidth,:)
) 开始。您可以达到的最佳质量是以完全相同的分辨率编写视频,而不是添加任何额外的光栅化。对于这种特殊情况,使用 writeVideo(vid, signal(:,k:k + windowWidth,:));
。
通常,共享基于矢量图形的 "video" 的最佳方式是共享生成图形的 运行 可用代码。例如,这就是 Adobe Flash、Microsoft Silverlight 和类似产品所做的。您可以选择相同的方式并将生成图形的代码共享为空白源代码(需要 MATLAB 运行)或作为 JAR(需要您拥有 Compiler SDK,昂贵!)。
为了以便宜且易于访问的方式分享 10 个矢量图形的 10 秒视频,我会使用一些 HTML/JS 将它们包装成动画。您最终会得到 12 个松散文件,但所有标准技术都可以在大多数系统上查看。
我想要一个矢量图形视频输出,这样我就可以在 Matlab 2016a 中播放视频时调整 window 的大小。 我希望在图片中具有与 .eps 3 格式相似的特征,但对于视频。 伪代码的一些概述
- 在 10 秒内以 .mat 格式读取图片数据,因此您可以选择可能适用于视频的任何矢量图片格式
- 在
colormap(gray)
中有图形句柄,而不是先将图片存储到imgRGB
/imgPNG
/... 并进行特定自定义 - 将图形句柄
hFig
添加到列表signal
- 视频的循环图形句柄
我不确定列表中有很多图形句柄并将它们循环到一个主要图形中。 这可能是不可能的。
我目前使用非矢量化 imgRGB
/imgPNG
/... 的方法我想拒绝,因为调整大小 window 和缩放 [=20= 有几个问题]
imgRGB
是 15x15x3。执行signal=cat(2,signal,imgRGB);
将信号增加到 15x30x3, ..., 15x15Nx3,这似乎不是存储许多图片的好方法。
伪代码
%% Make vector graphics pictures that are parts of the video
signal=[];
for k=1:3
A=load(filenameMat); % = A.time, A.potential, A.matrix
% TODO convert to some vector form each picture which should work in video too
% I can make N .eps pictures and figure handle to all of them.
% So probably having a list of those figure handles is the way to go.
hFig=figure(); % but not sure if possible with vectorised video play
signal=cat(2,signal,hFig); % pseudo
end
%% Put parts together in the main Figure i.e. video
%
windowWidth = 320;
hFig=figure('Menubar','figure', 'NumberTitle','off', 'Color','k', 'Visible', 'on');
hImg = imshow(signal(:,1:1 + windowWidth,:), ...
'InitialMagnification', 100, 'Border', 'tight');
vid = VideoWriter('signal.avi');
vid.Quality = 100;
vid.FrameRate = 60;
open(vid);
M = size(signal,2);
for k=1:(M - windowWidth)
set(hImg, 'CData', signal(:,k:k + windowWidth,:))
writeVideo(vid, getframe());
end
close(vid);
如何在 Matlab 中输出矢量图形视频?
无法放置 vector graphics into a video. Any video format supported by MATLAB (and any video format I know) is based on raster graphics。编写视频时,您必须接受它是光栅化的。
你的代码还有一个问题,我不明白。您已经从光栅图像 (signal(:,1:1 + windowWidth,:)
) 开始。您可以达到的最佳质量是以完全相同的分辨率编写视频,而不是添加任何额外的光栅化。对于这种特殊情况,使用 writeVideo(vid, signal(:,k:k + windowWidth,:));
。
通常,共享基于矢量图形的 "video" 的最佳方式是共享生成图形的 运行 可用代码。例如,这就是 Adobe Flash、Microsoft Silverlight 和类似产品所做的。您可以选择相同的方式并将生成图形的代码共享为空白源代码(需要 MATLAB 运行)或作为 JAR(需要您拥有 Compiler SDK,昂贵!)。
为了以便宜且易于访问的方式分享 10 个矢量图形的 10 秒视频,我会使用一些 HTML/JS 将它们包装成动画。您最终会得到 12 个松散文件,但所有标准技术都可以在大多数系统上查看。