MATLAB에서 많이 사용하는 plot 명령으로 그려진 figure에서 움직이는 그림을 구현하는 경우 MATLAB은 이를 AVI 형태로 저장하는 기능을 제공합니다. 이번에는 이 기능을 소개해 보겠습니다.



먼저 형식은

객체이름 = avifile('파일이름.avi')

<일반적 코드>

프레임이름 = getframe;
객체이름 = addframe(객체이름, 프레임이름);

객체이름 = close(객체이름);

의 형태입니다. 



순서는 avifile로 열고, getframe으로 프레임정보를 받고, addframe으로 프레임을 추가하고 close로 닫으면, avi화일이 만들어 집니다. 사용할 만한 예제로 예전에 올렸던 애니메이션 만들기라는 글에서 다루었던 내용(참조)을 대상으로 하겠습니다. 당시 그렸던 그림은


이었는데요. 저기서 빨간색 부분이 트랙을 따라 움직이는 것이었습니다. 이때 사용한 코드가


AniTest = figure('name','Animation Test','numbertitle','off');
x = [-3 -3.5  -4 -4 -3];
y = [1 1.5 1 -1 -1];
 
box = fill(x,y, 'r','EraseMode','normal');
grid on
hold on
axis([-5 5 -5 5]);
 
t = 0:0.01:2*pi;
plot(3*cos(t), 3*sin(t))
plot(17^0.5*cos(t), 17^0.5*sin(t))
plot((3.5^2+1.5^2)^0.5*cos(t), (3.5^2+1.5^2)^0.5*sin(t), 'c')
 
for t = 0:0.01:2*pi
    updatedX = [10^0.5*cos(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*cos(-(t+pi+atan(3/7))) 17^0.5*cos(-(t+pi+atan(1/4))) 17^0.5*cos(-(t+pi-atan(1/4))) 10^0.5*cos(-(t+pi-atan(1/3)))];
    updatedY = [10^0.5*sin(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*sin(-(t+pi+atan(3/7))) 17^0.5*sin(-(t+pi+atan(1/4))) 17^0.5*sin(-(t+pi-atan(1/4))) 10^0.5*sin(-(t+pi-atan(1/3)))];
    set(box, 'Xdata', updatedX,'Ydata', updatedY);
    drawnow;
    
    for i=1:5000000
        temp = i;
    end
end
입니다. 이 코드에서 for문앞 14번행쯤에 avifile을 삽입하고, getframe을 23번과 24번행 사이에 위치시키고, addframe코드를 그 다음으로, close를 마지막에 삽입하도록 하겠습니다. 그러면 실제로는






AniTest = figure('name','Animation Test','numbertitle','off');
x = [-3 -3.5  -4 -4 -3];
y = [1 1.5 1 -1 -1];
 
box = fill(x,y, 'r','EraseMode','normal');
grid on
hold on
axis([-5 5 -5 5]);
 
t = 0:0.01:2*pi;
plot(3*cos(t), 3*sin(t))
plot(17^0.5*cos(t), 17^0.5*sin(t))
plot((3.5^2+1.5^2)^0.5*cos(t), (3.5^2+1.5^2)^0.5*sin(t), 'c')

aviobj = avifile('test.avi');
 
for t = 0:0.01:2*pi
    updatedX = [10^0.5*cos(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*cos(-(t+pi+atan(3/7))) 17^0.5*cos(-(t+pi+atan(1/4))) 17^0.5*cos(-(t+pi-atan(1/4))) 10^0.5*cos(-(t+pi-atan(1/3)))];
    updatedY = [10^0.5*sin(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*sin(-(t+pi+atan(3/7))) 17^0.5*sin(-(t+pi+atan(1/4))) 17^0.5*sin(-(t+pi-atan(1/4))) 10^0.5*sin(-(t+pi-atan(1/3)))];
    set(box, 'Xdata', updatedX,'Ydata', updatedY);
    drawnow;
    
    for i=1:5000000
        temp = i;
    end
    
    mo = getframe;
    aviobj = addframe(aviobj, mo);
end

aviobj = close(aviobj);
이렇게 만들어 지는 군요. 그러면, 해당코드가 실행되는 current folder에 test.avi라는 화일이 생성되어 있을 겁니다.



결과를 한 번 보실까요...^^



이렇게 되는군요^^


http://pinkwink.kr/trackback/287 관련글 쓰기
  • 엘리 2010/04/09 14:24

    인기가 절정;;;이시네요 ^^
    투데이가 와우~카페보다 많아.....ㅜㅜ
    강좌 항상 잘보고 있습니다 ^^
    2009구해서 할라구요 전 지금 7.0.4
    이거 완전 대박 입니다 ㅡ0ㅡ~~~!!!!!
    나름대로 제어기를 설계해서 졸작을 해보려고 많이 많이 어렵네요....
    개념이 확실하지않아서 인가봐요 주먹구구로 항상 해왓더니.....

    • PinkWink 2010/04/09 22:22

      저도 그렇습니다..
      일단 의도대로 동작만 한다면...ㅜ.ㅜ 하고 무턱대고 바라지요...^^
      그러다 우연히 동작이 의도대로 되면...
      그저 사용할 뿐일때가 많지요...ㅎㅎ
      저도 그렇습니다.^^

  • 바람처럼~ 2010/04/09 14:51

    와~ 진짜 인기 절정이시네요
    이런 전문적인(?) 글인데도 불구하고 방문자 수가 장난 아니십니다!!

    • PinkWink 2010/04/09 22:23

      인기??? 헉...
      공학관련해서...
      제가 알고있거나 알고싶은것을 정리하는 블로그라는 개념으로 사작할때부터 인기...는 ㅎㅎㅎㅎ 없는건데요..ㅜ.ㅜ

      아마... 검색유입이 많아서일겁니다... ^^

      간혹... 제가 자주 놀러다니는 블로거들께서
      제발 댓글달 수 있는 글좀 올려달라는 말씀을 하실때마다
      오히려 죄송스럽습니다....^^

  • 라라윈 2010/04/12 03:06

    볼수록 저도 MATLAB이 배워보고 싶어져요...
    핑크윙크님이 올려주신대로만 따라하노라면 잘 할 수 있을 것 같다는
    자신감이 생겨요~ ^^

    • PinkWink 2010/04/12 04:31

      헉.. 그..그건 저 칭찬하신거죠???^^
      아니더라도 뭐 그냥 그렇게 생가하겠습니다..^^
      전 개인적으로 어떤 툴을 다루는 것은 대체로 쉽다고 생각합니다. 딱 다루기만 할때는....(^^)
      문제는 나한테 알맞게 어떻게 사용해야할지 결정하고 알아내는 과정이 너무 어려운것 같아요^^

  • 로봇_효 2010/04/14 12:09

    음... 이런 기능이 있었군요. 자이로 센서 관련해서 자료 수집중에 우연히 여기로 왔다능...

    이것 저것 보는중에 이런 알찬 내용이 ^^*

    관련 소스 제가 접수해요 ㅋㅋ

    • PinkWink 2010/04/15 01:39

      접수해주시다니 제가 다 기분이 좋군요^^

  • kay 2010/06/04 15:11

    오홋! 저도 접수하겠습니다 (^o^)/

  • no.57 2010/09/16 16:06

    아름답습니다 형님 ㅋㅋㅋ

    • PinkWink 2010/09/16 17:56

      도대체 뭐가?? 목적어를 밝혀라.. ㅋㅋㅋ

  • Yoon 2011/03/04 06:40

    혹시 OS를 어떤 버젼을 사용하는지 알 수 있을까요?
    제가 Win7+Matlab 2009b에서 avifile을 실행시키면 indeo5 경고가 뜨면서 실행이 안되거든요
    Mathwork이랑 Matlab Central이랑 몇몇 포럼을 봐도 해결이 잘 안되네요.

    • PinkWink 2011/03/04 09:01

      이건 정확한 정보가 아닙니다만, 2009버전과 win7은 충돌이 있는 것으로 알고 있습니다. 저는 win7에서 2010a 버젼을 사용하고 있습니다.

    • 혹시이게 도움이 될까요 2011/09/17 08:14

      저도 이런에러가 일어나서....
      http://www.mathworks.com/support/solutions/data/1-4G50RI.html

    • PinkWink 2011/09/17 12:08

      아이코.. 이런... 좋은 도움 감사합니다.
      저도 덕분에 또 좋은 공부를 합니다.^^

  • 코덱에러 2011/12/18 11:23

    Win7에서 2010a 쓰면 에러 안나나요?? 2011을 썼는데 에러가 나서요.....
    오히려 비스타에서 2011을 쓰면 에러가 안나던데;

    • PinkWink 2011/12/18 22:52

      제가 알기론 2009b버전부터 괜찮은걸로 알고 있는데요.

  • 은나미 2012/08/01 16:45

    위 내용과 관련해서 figure를 avi 파일로 저장하는데 많은 도움이 되었습니다. 감사합니다.
    그런데 figure의 x, y lable이나 title같은 것들은 avi 파일에 저장이 안되고, 기본적으로 avi file이 1초에 15 프레임이 재생되도록 저장이 되던데요!!
    figure창 전체가 저장되고, 1초에 1 프레임이 저장되도록 하는 방법은 없나요??

    도움 부탁드립니다.

    • PinkWink 2012/08/06 09:22

      아. 그거에 대해 생각해본적이 없었네요.
      설정에 없던가요?
      음. 저도 잘 모르겠습니다.

  • 메민 2014/05/23 10:06

    좋은 정보 감사합니다!!
    도움받고 갑니다~