【发布时间】:2013-12-19 07:53:06
【问题描述】:
对不起我的英语不好:(希望你们能理解我的问题。
这是我的双摆模拟代码。
close all;clear all; clc;
theta1 = -pi;
dtheta1 = -5;
theta2 = pi/2;
dtheta2 = 10;
m1 = 1;
m2 = 1.7;
r1 = 1.3;
r2 = 1;
g = 9.8;
duration = 5;
y0 = [theta1;dtheta1;theta2;dtheta2;m1;m2;r1;r2;g];
[t,y] = ode45(@eqns,[0 duration],y0);
theta1 = wrapToPi(y(:,1));
dtheta1 = y(:,2);
theta2 = wrapToPi(y(:,3));
dtheta2 = y(:,4);
fps = round(length(theta1)/duration);
X = zeros(length(theta1),3);
Y = zeros(length(theta1),3);
for i=1:length(theta1)
X(i,:)=[0,r1*sin(theta1(i)),r1*sin(theta1(i))+r2*sin(theta2(i))];
Y(i,:)=[0,-r1*cos(theta1(i)),-r1*cos(theta1(i))-r2*cos(theta2(i))];
end
mov = VideoWriter('Double Pendulum','MPEG-4');
set(mov,'FrameRate',fps,'Quality',100);
open(mov)
h = plot(0,0,'MarkerSize',30,'Marker','.','LineWidth',1.4);
range = 1.25*(r1+r2);axis([-range range -range range]); axis square;
xlabel('x');ylabel('y');title('Double Pendulum');
set(gca,'nextplot','replacechildren');
textlocation = range * 0.7;
hold on
for i=2:length(theta1)
set(h,'XData',X(i,:),'YData',Y(i,:));
plot([X(i-1,3) X(i,3)],[Y(i-1,3) Y(i,3)],'r')
plot(X(i,2),Y(i,2),'g')
frame = getframe;
writeVideo(mov,frame);
end
close(mov);
结果如下, https://www.dropbox.com/s/7pyagcnhca6khb3/Double%20pendulum%20result.PNG
由于某种原因,标签和标题没有被记录下来,而且我也意识到颜色与我在 Matlab 中看到的确实不同。我尝试使用“未压缩的 AVI”而不是“MPEG-4”在颜色和质量方面给我最好的结果,但文件大小为 50MB,而“MPEG-4”的文件大小仅为 560KB。
我想知道,是否有任何设置可以让我获得更好的色彩(更接近我在 Matlab 中看到的)和更小的文件大小(我对这种 mp4 质量非常满意)并且标签会被记录下来。
非常感谢。
【问题讨论】:
-
MPEG-4 视频 (
VideoWriter.getProfiles()) 的默认质量仅设置为 75/100。您是否尝试将其设置为 100?它会稍微增加文件大小,但颜色准确性可能会提高。不幸的是,MPEG-4/h.264 不是大多数视频 Matlab 数字的最佳编解码器(有更好的 h.264 版本/配置文件,但 Matlab 似乎使用端口设置)。您可以尝试 Motion JPEG 2000。或者,如果您不介意 QuickTime,请尝试我的QTWriter,它具有非常适合 Matlab 类型图形的编解码器。从那里您可以转换为其他格式。 -
我已经使用 "set(mov,'FrameRate',fps,'Quality',100)" 将我的质量设置为 100,但颜色仍然非常糟糕。谢谢你的建议,我会试试你的 QTWriter :)
标签: matlab