2013-12-19 87 views
2

對不起,我的英語不好:(希望你們能理解我的問題。(MATLAB R2013a)保存視頻使用VideoWriter但無法保存標籤和標題

拳,這是我的一個雙擺的代碼模擬。

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。

我想知道,是否有任何設置會給我一個更好的coulor(更接近我在Matlab中看到的)較低的文件大小(我對此mp4質量很滿意),並且標籤將被記錄下來。

非常感謝。

+0

時的默認畫質更換frame = getframe爲MPEG-4視頻('VideoWriter.getProfiles()')僅設置爲75/100。你有沒有試過把它設置爲100?它會稍微增加文件大小,但顏色準確性可能會提高。不幸的是,MPEG-4/h.264並不是大多數視頻的Matlab數字編解碼器(有更好的h.264版本/配置文件,但Matlab似乎使用端口設置)。您可以嘗試Motion JPEG 2000.或者,如果您不介意QuickTime,請嘗試我的['QTWriter'](http://stackoverflow.com/a/16827218/2278029),該編解碼器非常適合Matlab類型圖形。從那裏你可以轉換爲其他格式。 – horchler

+0

我使用「set(mov,'FrameRate',fps,'Quality',100)」將我的質量設置爲100,但顏色仍然非常糟糕。感謝您的建議,我會嘗試你的QTWriter :) – SamC

回答

0

您請教兩個問題:
1.如何在沒有色彩質量太退化壓縮視頻
2.如何捕捉標題和標籤爲每個幀

我會回答只有你的第二個問題:

如果您閱讀getframe的手冊,您會發現默認情況下它會捕獲當前的。爲了捕獲標籤和標題,您需要捕獲當前的數字。所以,你需要的是通過

frame = getframe(gcf); 
+0

這實際上只獲取xlabel ylabel和colorbar,如果它存在,它不會得到標題或例如colorbar縮放。 – Leo