본문으로 바로가기
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라는 화일이 생성되어 있을 겁니다. 결과를 한 번 보실까요...^^



이렇게 되는군요^^



댓글을 달아 주세요

  1. BlogIcon 엘리 2010.04.09 14:24 신고

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

    • BlogIcon PinkWink 2010.04.09 22:22 신고

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

  2. BlogIcon 바람처럼~ 2010.04.09 14:51 신고

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

    • BlogIcon PinkWink 2010.04.09 22:23 신고

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

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

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

  3. BlogIcon 라라윈 2010.04.12 03:06 신고

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

    • BlogIcon PinkWink 2010.04.12 04:31 신고

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

  4. 로봇_효 2010.04.14 12:09 신고

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

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

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

  5. kay 2010.06.04 15:11 신고

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

  6. no.57 2010.09.16 16:06 신고

    아름답습니다 형님 ㅋㅋㅋ

  7. Yoon 2011.03.04 06:40 신고

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

    • BlogIcon 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

    • BlogIcon PinkWink 2011.09.17 12:08 신고

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

  8. 코덱에러 2011.12.18 11:23 신고

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

  9. 은나미 2012.08.01 16:45 신고

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

    도움 부탁드립니다.

  10. 메민 2014.05.23 10:06 신고

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

  11. 피리군 2014.08.28 22:19 신고

    여기서 맨마지막에
    for i = 1:5000000;
    temp = i;
    end
    을 왜 쓰셧는지 모르겟네요... 알려주실수 있으신가요??

    • BlogIcon PinkWink 2014.08.28 23:26 신고

      그건 너무 빨라서입니다 적당히 느리게 안하면 눈에 안보여요 ㅎ

    • 피리군 2014.08.29 12:06 신고

      답변 감사합니다.
      그러면 위의 식을 없애도 상관 없겟네요..
      그럼
      t에 관한 식만으로 1초를 만들수 있겟네요??
      맞는 말인가요??ㅎ

    • BlogIcon PinkWink 2014.08.29 12:35 신고

      정확하게 질문의 의도가 좀 헷갈립니다만
      코드가 동작하는데 그 for-500~~~하는 반복문은 의미가 없습니다.
      단지 한 번 그리고 좀 쉬라는 뜻이니까요.
      그리고 그림1에 관한 식만으로 1초를 만든다는 건 무슨 말인지 모르겠습니다.ㅠㅠ

    • 피리군 2014.08.29 13:55 신고

      저는 그림 1을 말씀드린게 아니라..
      t = 0:0.01:2*pi 를 말씀드린거 입니다...
      답변 감사합니다.

    • BlogIcon PinkWink 2014.08.29 15:18 신고

      아하~ 그러네요... "그럼 t"를 제가 그림 1로 잘못 봤네요... 흠..ㅠㅠ 노안인가?ㅠㅠ. 안과에 가봐야겠어요... ㅠㅠ

  12. 오현대 2015.05.07 21:36 신고

    매트랩으로 도플러효과를 이용해서 그래프를 그리려고하는데 Plot 그리는게 안되서 그러는데 좀 도와주실 수 있으신가요ㅠㅠ?

  13. 장현 2015.10.08 23:36 신고

    매트랩에대해 아무것도 아는게 없는 상태에서 질문하나 드려도되나요..
    제가 하고싶은게 x가 고정되어있고 y축으로만 이동하는 점이있는 상태에서
    이점의 시간에대한 변위함수를 알고있을때
    이를 위의 동영상처럼 만들고 싶은데 혹시 정말 도움좀 주시면 안될까요... 부탁드립니다 ㅠㅠ

    • BlogIcon PinkWink 2015.10.09 09:21 신고

      위와 절차가 비슷할듯한데요..

      1. 시간 행렬을 정의해둔다..
      2. 그로부터 y변위 결과를 계산해서 정의해둔다..
      3. 위 본문에서 이야기한 데로 비디오로 저장한다..

      그리고.. 저의 다른 글을 보시면 비슷한 절차를 따라 움직인 것이 있을 겁니다.

    • BlogIcon PinkWink 2015.10.09 11:37 신고

      흠.. 흰색으로 칠해도 되고.. 아예 칠하고 싶지 않다면 fill 명령말고 다각형을 그리는 명령을 사용하셔도 될듯합니다.

    • 장현 2015.10.09 11:38 신고

      정말 감사합니다. 좋은하루 되세요

    • 장현 2015.10.12 19:31 신고

      정말 핑크윙크님 덕분에 매트렙 과제하나 완성해냈습니다.
      정말 마지막으로 궁금한게 있어 이렇게 글남깁니다.
      avi파일 코딩을 추가해서 파일을 뽑아내니, 격자와 좌표축이 전부 사라져버리는데 avi파일내에 이들을 추가시킬수있는 방안은 없는지 궁금합니다. 정말 감사해요 ㅠㅠ

    • BlogIcon PinkWink 2015.10.13 13:22 신고

      앗.. 그건 안해봤어요ㅠㅠ. avi 녹화하는 옵션을 확인하든지.. 혹은 다른 화면 녹화 프로그램을 이용해야할 수도 있지 않을까요. 그건 안해서..빠르게 답변을 못드리네요ㅠㅠ