VideoWriter を使ってアニメーションを MPEG-4 として保存すると、画​像がチカチカするのは​なぜですか?

조회 수: 54 (최근 30일)
MathWorks Support Team
MathWorks Support Team 2020년 10월 16일
답변: MathWorks Support Team 2020년 10월 16일
VideoWriter オブジェクトを使用して、MATLAB のグラフィックスで作成したアニメーションを MPEG-4(.mp4) として保存しています。
作成した動画を Windows Media Player や VLC media playerなどの外部アプリケーションで再生すると、細いラインの色がチカチカと変化したり、フレーム毎の輝度が異なっているように見えます。
figure
t = linspace(0,10,1000);
y = randn(size(t));
plot(t,y)
hold on
h_x = xline(t(1),'--r');
v = VideoWriter('newfile.mp4','MPEG-4');
v.Quality = 100;
v.FrameRate = 10;
open(v)
for n = 1:length(t)
h_x.Value = t(n);
drawnow limitrate
frame = getframe(gcf);
writeVideo(v,frame);
end
close(v)

채택된 답변

MathWorks Support Team
MathWorks Support Team 2020년 10월 16일
この現象は、ご利用環境の解像度が getframe 関数での画像キャプチャに影響しているようです。
特に、MPEG-4 への出力では、圧縮がかかるため、影響がより大きく表れてしまうようです。
例えば、下記のように非圧縮の AVI ファイルとして保存すると、画質が改善します。
v = VideoWriter('newfile.avi','Uncompressed AVI');
% v = VideoWriter('newfile.mp4','MPEG-4');
% v.Quality = 100;
% v.FrameRate = 10;
代替案として、できるだけ Figure のサイズを大きくした上で、getframe 関数で取得した画像データを imresize 関数でサイズを大きくする方法が考えられます。
 
close all, clear all
figure('units','pixels','position',[0 0 1000 800]) % Figure を大きめに作成
t = linspace(0,10,1000);
y = randn(size(t));
plot(t,y)
hold on
h_x = xline(t(1),'--r');
v = VideoWriter('newfile.mp4', 'MPEG-4');
v.Quality = 100;
v.FrameRate = 10;
open(v)
for n = 1:length(t)
  h_x.Value = t(n);
  drawnow limitrate
  frame = getframe(gcf);
  f = imresize(frame.cdata,4); % 4倍にリスケール
   writeVideo(v,f);
end
close(v)

추가 답변 (0개)

제품


릴리스

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!