예언자일보 프로젝트의 대미를 장식할 마지막 단계.
검출된 마커에 동영상을 삽입하는 방법이다.

동영상이라고 하는 것이 뭐 거창한 것 같지만 실제 형태는 스틸컷의 연결 정도로 보는 것이 적당하다. (MPEG 압축 등은 별개)
다시말해 모든 프레임을 이미지 형태로 가져올 수 있다는 말이다.

이렇게 매 프레임을 추출된 마커의 꼭지점 정보를 이용하여 변형한 뒤 원 영상에 삽입함으로써
일명, 예언자일보 프로젝트를 마무리 한다.


1. 변수 선언
- 동영상 파일을 불러오기 위한 변수 선언. 캠 영상과 그 형태가 같다.


2. 파일 불러오기
- 동영상 파일의 경로를 설정한다.





3. 프레임 이미지 얻어오기
- 현재 프레임의 이미지를 임시 변수인 IplImage* MusicVideo에 가져온다.
이 변수는 메모리를 할당받아 사용하는 것이 아니라 프레임의 주소만을 가져오므로 따로 메모리를 해제하지 않는다.

- 이미지의 크기를 이용하여 뮤직비디오의 좌표계를 설정한다.



4. 좌표 변환행렬 생성 및 와핑
- 마커의 네 꼭지점을 위와 같은 순서(LEFT-TOP → RIGHT-TOP → RIGHT-BOTTOM → LEFT_BOTTOM)로 정렬한 뒤,
ptPrespective 변수에 넣는다.



- 변환행렬 생성 및 와핑. OpenCV의 장점이 유감없이 발휘되는 시간이다.
와핑에 대한 자세한 내용은 cvWarpPerspective() 사용 방법을 참고하면 된다.



5. 최종테스트
- 멀티미디어 신문



- 다중 마커 테스트




(SoaS 뮤직비디오 포함)


THE END
by 마틴

이 강좌는 마틴 블로그 닷 넷, 대한민국 최고의 컴퓨터비젼 커뮤니티 OpenCV Korea가 함께 합니다.






캠을 사면 제일 먼저 해보리라 마음 먹었었던, 예언자일보 프로젝트를 강좌형식으로 진행하면서
예상치 못했던 많은 사람들이 함께 공감해주고 즐거워하는 것에 대단히 보람을 느꼈습니다.

저역시 아직 공부하는 단계이고 부족한 것이 많은데도 불구하고,
다른 강좌를 이끌어 달라는 메일과 쪽지들에 고맙기도 하면서,
부족한 제 모습에 한편으로 무거운 마음 금할 길이 없습니다.

형식이 그러하다 보니 아무래도 시간 소요가 많은 것은 사실입니다만,
제가 어설프게 알고 있던 부분들을 누군가에게 이야기하기 위해 더 자세하고 확실하게 알아야 한다는 점은
강좌형식으로 프로젝트를 진행해 나갈 때의 소중한 장점 중 하나입니다.

앞으로도 영상처리와 관련된 다양한 아이템들로 강좌를 진행할 예정입니다.
부디 초보자분들에게는 영상처리 개념을 잡는데 도움이 되고,
중고급 프로그래머분들에게는 답글을 달 "꺼리'를 제공할 수 있고, 토론의 장이 될 수 있는 그런 강좌들이 되면 좋겠습니다.

고맙습니다.


Posted by K. Martin

댓글을 달아 주세요

  1. Favicon of http://acaran.net acaran 2009/07/21 21:31  댓글주소  수정/삭제  댓글쓰기

    우와~ 영화에서 보던거를 그대로 구현하셨네요 ㄷㄷㄷ 대단하십니다 -_-)b

  2. 김영균 2009/08/21 00:28  댓글주소  수정/삭제  댓글쓰기

    검색하다 들렀는데 정말 대단하시네요

    저는 이제 bitmap bitbit로 뿌리는 초보라 'ㅇ'

    정말 멋지십니다!

  3. 아브라카다브라 2009/10/02 10:37  댓글주소  수정/삭제  댓글쓰기

    마틴님 블로그의 소스를 받아 공부하고 있는데요.
    마커를 통한 동영상이 플레이어로 돌린 동영상보다 훨씬 느리게 재생이 되더라고요. 그래서
    SetTimer( _DEF_WEBCAM, 100, NULL ); // 타이머 설정 이부분을
    SetTimer( _DEF_WEBCAM, NULL, NULL );
    으로 바꿔봐도 싱크가 전혀 맞지를 않네요.
    fps를 조절하려면 이부분을 건드리는게 아닌가요?
    정확히 어떤부분을 건드려줘야할지 잘 모르겠네요.
    가르쳐 주시겠어요?

    • Favicon of http://martinblog.tistory.com K. Martin 2009/10/05 10:10  댓글주소  수정/삭제

      제가 동영상 출력에만 촛점을 두고 있어서 미처 그것들 까지는 생각하지 못했네요.
      싱크를 맞추려면,
      현재 시점과 동영상 출력 시작 시간을 계산하여
      각 시간에 맞는 프레임을 직접 가져오는 방법이 있을텐데요,
      개발된 프로그램은 무조건 다음 프레임을 가져오기 때문에 문제가 생기는 것 같습니다.
      타이머의 시간만 바꾸는 것은 마커를 찾는 것들 등의 프로세싱타임을 고려해 볼 때
      크게 도움이 될 것 같지는 않구요,
      아마 RetrieveFrame 할 때 프레임 번호를 넣을 수 있도록 되어 있을거니까
      시간 계산해서 프레임번호를 직접 가져오면 좋을 것 같네요.
      참고하세요.

  4. Favicon of http://blog.naver.com/chensi chensi 2009/10/05 23:12  댓글주소  수정/삭제  댓글쓰기

    감사합니다 =ㅅ= 덕분에 비슷하게 구현했습니다 ㄲㄲ

  5. ^^ 2009/12/07 14:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 정말 많은 도움 받아갑니다^^

    감사해요^^ 저도 열심히 공부해서 다른사람에게 도움이 되고싶습니다.

  6. 2010/02/01 16:03  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  7. 밤비아빠 2010/04/05 03:22  댓글주소  수정/삭제  댓글쓰기

    첨부된 예제소스를 테스트 해보았습니다.
    2D 마커를 임의로 출력하여 예제를 실행시킨결과
    마커를 인식하고 꼭지점과 테두리 표시는 정상적으로 표현됩니다.
    그 상태에서 우측하단 뮤직비디오체크박스를 체크하면
    인식표시는 사라지는데
    뮤직비디오는 재생되지 않습니다.
    어떤 문제일까요ㅠ??

  8. 밤비아빠 2010/04/05 11:39  댓글주소  수정/삭제  댓글쓰기

    운영체제가 윈도우7 입니다.
    동영상을 단순 재생시키면 문제없이 실행됩니다.

    프로그램예제소스를 실행하고 임의로 출력한 마커이미지를 화면에 비추면
    각 꼭지점을 인식하고(좌표까지), 사각형이 그려집니다.
    이상태에서 체크박스를 True로 만들면
    동영상이 재생되어야할듯한데,
    이상하게 재생되지 않습니다.
    인식되던 선들과 좌표는 모두 사라지고 동영상만 나오지 않네요 ㅠ

    단순 코덱문제라고 취급하기에는
    일반재생이 가능하니 ㅠ 뭐가 문제일까요ㅠ??

    • Favicon of http://martinblog.tistory.com K. Martin 2010/04/05 11:56  댓글주소  수정/삭제

      아, 간과한 부분이 하나 있는데,
      그냥 타이머를 돌려서 동영상을 출력하기 때문에
      영상이 천천히(논리적으로 초당 10frame) 출력됩니다.
      첨부한 동영상의 초반부가 검은영상만 있기 때문에,
      영상이 재생이 안되는 것 처럼 보일 수가 있는데요,
      조금 기다려 보시면 느~린 동영상이 출력되는 것을 확인할 수 있을 것 같습니다.

      그것도 아니라면 달리 저도 왜 그런건지 잘 모르겠네요. 도움을 못드려 죄송하네요.

    • millo 2012/01/20 14:52  댓글주소  수정/삭제

      저도 이부분 때문에 많이 해매다 찾게 되었는데요
      코덱문제인거 같습니다.
      FFDShow MPEG-4 Video Decoder 해당 코덱 네이버에서 찾아서 설치하시면 잘 돌아가네요.

  9. 박민수 2010/04/06 23:26  댓글주소  수정/삭제  댓글쓰기

    저 안녕하세요.정말 이곳 글로 인해 영상처리 공부가 많이 되었습니다.
    궁금한게 있는데요. 이것처럼 와핑 안하고 그냥 PICTURE컨트롤에 파일열어서 재생시키고, 이 재생되고 있는 화면을 이진화 해서 아랫부분에 PICTURE컨트롤 하나더 만들어서 돌릴수 있나요..잘안되서요..
    pjsminsu@naver.com

  10. 궁금이 2010/05/04 00:10  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 강좌 잘보았습니다..^^;;
    응용으로 마커안의 M 도 레이블링 하고 싶은데,,생각만큼 쉽질 않네요...
    어떻게 접근해야할지 간단히 설명좀 해주실수있을까요^^?

    • Favicon of http://martinblog.tistory.com K. Martin 2010/05/04 12:19  댓글주소  수정/삭제

      인식된 마커 내부만 이진화 해서 레이블링을 하면 될 것 같은데요.
      제가 질문 내용을 제대로 이해한 것이 맞다면요. ^^

  11. 퍼렁괴물 2010/08/14 21:45  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    강좌 잘 보았습니다, 필요한 작업이 있어서 프로그램 처음 접해보고 따라해보았습니다
    여러모로 공부가 되었습니다. 고맙습니다
    궁금한 것이 있는데,
    동영상을 반복 재생하고 싶은데 어떻게 해야 할까요
    이대로 따라하니 영상이 한번 재생되고 끝나는데,
    영상을 무한루프 시키고 싶은데 알려주시면 안될까요?^^;;

    • Favicon of http://martinblog.tistory.com K. Martin 2010/10/03 00:55  댓글주소  수정/삭제

      영상이 끝나면 다시 플레이 해주면 됩니다.
      영상이 끝났는지 알아내는 것이 중요할 텐데요,
      OpenCV에서는 cvGetCaptureProperty를 통해 현재의 프레임을 알아낼 수 있습니다. 참고하세요.

  12. 이현준 2010/10/02 19:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 이거 보고 정말 열심히 공부하고 있습니다.
    정말로 너무나 안되는 부분이 있어서 질문좀 드릴게요 ㅠㅠ
    각 마커가 있잖아요 이 마커들 끼리 서로 다른 영상을 뿌려주고 싶습니다.
    안의 문자를 인식해서 1번 문자는 1번영상 2번문자는 2번영상을 뿌리고 싶습니다.
    마커의 꼭지점중 레프트탑의 좌표만을 포인트로 저장하여 비교하며 하고 싶은데
    꼭지점의 레프트좌표가 어떤 것인지는 찾아 냈는데 마커가 2개 이상이 될때,
    그 마커의 레프트탑이 각각 어디로 저장 되고 어떻게 가져다 써야 하는지 통 감이 안잡히네요 ..
    네이버OpenCV카페 에서도 열심히 찾아 보는데 답이 잘 안나오네요 바쁘시겠지만
    혹시 답을 주실수 있으신가요.. 너무 답답하네염 ㅎㅎ
    혹시 메일로 답변해 주실지 몰라 메일도 남겨 놓겠습니다.
    lhjun22@gmail.com
    정말 궁금하네요!! 혹시 메신저쓰시면 메신저 아이디라도 알려주시면 감사하겠습니다. ㅠㅠ

    • Favicon of http://martinblog.tistory.com K. Martin 2010/10/03 01:09  댓글주소  수정/삭제

      영상안에 있는 모든 마커를 찾도록 프로그램 되어 있으며, for( int i=0; i < blob.m_nBlobs; i++ )를 보시면 아시겠지만 각각의 마커 배열이 따로 생성되는 것은 아니며 한 번 루프를 돌 때 마다 새로운 마커 좌표를 생성하는 방식입니다. 그래서 그때그때 둘 또는 세 개 이상의 마커가 될 수도 있고 그 순서도 바뀔 수 있습니다. 각각의 마커를 인식하는 방법은 난이도가 좀 어려운 부분이지만 님께서 생각하신 것 처럼 마커의 레프트좌표를 이용하여 왼쪽/오른쪽의 마커를 구분하신다면 추출된 꼭지점의 좌표 CvPoint2D32f ptSource[4]를 다른 배열을 생성한 후 옮겨 두신 다음에 서로를 비교하시는 것이 좋을 듯 싶네요. 참고하세요.

  13. 슈엔똘 2010/11/02 14:21  댓글주소  수정/삭제  댓글쓰기

    ㅁ ㅏ틴님~~!! 강좌 정말 잘 보았습니다. 한가지 해보고 싶은게 생겼는데요...
    혹시 강좌에 이어서 마커영역을 검출 후에 동영상을 삽입하는데..
    그 곳이 손가락 등에 의해 가려지면 사라져 버리는 문제가 발생하는데요..
    혹시 모서리를 추출하는 과정중에 찾아낸 모서리점들을..
    가려짐이 생기더라도 그 부분을 복원해서 그대로 고정시키는 방법은..
    그런 함수는 있을까요??^^ 조언 부탁드려봅니다.^^
    좋은하루 보내세요^^

    • Favicon of http://martinblog.tistory.com K. Martin 2010/11/03 08:53  댓글주소  수정/삭제

      네. 말씀하신 것 처럼, 강좌의 예는 추출한 마커에 이미지를 출력하는 것인데요. 마커가 가려도 그것이 가능하게 하려면, 쉽게는 마커의 위치를 저장해가면서 프레임 중간중간 추출이 안되는 경우에도 이전 프레임의 마커정보에 출력을 해주는 방법이 있고요, 마커의 특징을 꼭지점 정보가 아닌 윤곽선 정보를 이용하는 방법이 있을 수 있습니다. 참고가 되셨길 바랍니다.

  14. 슈엔똘 2010/11/03 17:16  댓글주소  수정/삭제  댓글쓰기

    아^^ 좋은 참고가 되었습니다. 크크~
    그런데 이전 프레임의 마커정보에 출력을 해주는 방법이라고 하면, 카메라가 움직일때는 증강이 잘못 되어지게 되겠군요~!^^;; 아닌가.. 음.. 전 PCA를 이용해서 가려진 부분을 복원해보려 했는데.. 실시간으로 트레킹 되는 점을 생각하면 느려지지 않을까 해서요..ㅠ 윤곽선 정보를 이용하게 된다면 내부/외부의 윤곽선이 가려지는 경우도 .. 혹시 허프만 알고리즘을 이용해서 윤곽선을 찾아낸다면 괜찮은 방법인지.아~ 이것저것 참 생각이 많아서 마틴님 블로그에 주절주절 글을 남겨보게되네요^^

    • Favicon of http://martinblog.tistory.com K. Martin 2010/11/04 16:35  댓글주소  수정/삭제

      고맙습니다. 실시간추출을 위해서 어떤 알고리즘이 더 좋을지는 저도 늘 고민하고 있답니다.
      종종 들러주셔서 이런저런 이야기 나눌 수 잇으면 좋겠네요.

  15. 뽐갱 2010/11/13 02:51  댓글주소  수정/삭제  댓글쓰기

    마틴님~~강좌 너무 너무 잘봤습니다. 동영상 말고 ARToolKit에서 사용하는 3차원 그래픽을 마틴님의 소스에 가져와서 증강을 시켜보고 싶은데 이리 저리 시도를 해보고 있지만 잘 안되네요..ㅠ 조언 부탁드려봅니다 ^^
    즐거운 금요일 저녁 보내세요~~

  16. 흐밍흐밍 2011/03/23 19:09  댓글주소  수정/삭제  댓글쓰기

    영상을 나올때 음성까지 같이 나오게 하는 방법은 없나여???

  17. 박성훈 2011/04/04 14:06  댓글주소  수정/삭제  댓글쓰기

    마틴님은 제 한줄기 희망과도 같은 분이에요 ㅠㅠ

    증강현실로 졸작하는데 주변에 증강현실 가르쳐줄 분이 없었거든요.

    교수님은 감독만 하는거라 ㅠㅠ

    근데 몇일 동안 증강현실 검색하다가 우연히 마틴님 홈피에!!!

    이건 운명이에요 ㅋㅋㅋ

    정말 많은거 배우고 갈게요. 가끔씩 질문해도 되나요?

    졸작남은기간이 2달정도 남았는데,, 질문해도 되죠?

    • Favicon of http://martinblog.tistory.com K. Martin 2011/04/05 09:03  댓글주소  수정/삭제

      질문은 언제나 환영하며,
      제가 알고 있는 부분은 최선을 다해 설명을 드릴 수 있도록 하겠습니다.
      열심히 하세요. 화이팅!

  18. 흐밍흐밍 2011/04/07 02:12  댓글주소  수정/삭제  댓글쓰기

    제가 영상 매핑까지 시켰는데
    영상이 매핑시킨곳을 축으로 하여 가로세로로 쭈욱


    ㅁㅁㅁㅁㅁㅁㅁ


    이렇게 나오는데 어느부분을 건드려야 할까여??
    초기화가 안되서 그런가?? 바쁘신데 답변 부탁드릴께여 마틴님 ^^

  19. 흐밍흐밍 2011/04/07 02:33  댓글주소  수정/삭제  댓글쓰기

    제가 opencv2.0을 쓰는데 원래 1.0에서는 잘나오는데 2.0으로 가니깐 이러네여
    먼지 잘몰르겠어여 왜이러는징;;

  20. 박성훈 2011/04/07 10:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ㅋㅋ

    마틴님께서 질문환영한다고 하셔서

    질문 대방출하려고요ㅋㅋㅋ

    1. 마틴님이 만드신 소스가 여러개의 마커를 인식하여 그것들에 한개의 동영상을 다 넣을 수 있는 거잖아요. 그럼 여러개의 마커가 있을때 각각의 마커에 다른 동영상을 넣고 싶은데 이거 많이 어려운건가요?

    2. 위에 이현준님께 1번 질문에 대하여 메일을 보냈더니 탬플릿매칭을 이용해 보라고 하더라구요. 그래서 탬플릿 매칭을 해보려고 제가 한번 실험 해봤어요. A에는 배경이미지 B는 배경에서 내가 찾고싶은 이미지 C는 배경에서 내가 찾고싶은 이미지에 사각형을 그리는것. 근데 여기서 막히는게요 B이미지 크기가 A에서의 B이미지보다 크게되면 B이미지를 찾지 못하더라구요. 동영상이라면 물체가 앞뒤로 움직이니까 화면내에서 제가 찾고싶은 이미지의 크기가 계속 변하잖아요. 이런 문제는 어떻게 해결해야할까요? ㅠㅠ
    진짜 미치겠어요.. 완전 초보인데 제게 이런 어려운 문제를 혼자하려니까요 ㅠㅠ(나머지 조원 2명은 컨텐츠담당이라...ㅠㅠ)

    마틴님 도와주세요...! 시간이 되신다면 나중에 여러마커에 각각의 동영상 넣기도 강의해주시면 직접 저희 조원들과 찾아가서 감사의 표시라도 하고싶네요 ㅠㅠ

    • Favicon of http://martinblog.tistory.com K. Martin 2011/04/19 10:58  댓글주소  수정/삭제

      1. 난이도 중상
      2. 템플릿매칭 알고리즘 중에도 크기변화에 덜 민감한 것들이 있습니다. 쉽게 설명하면 비교하려는 사진을 여러 크기로 변환해 가면서 템플릿매칭 하시면 됩니다.
      3. 개인적인 강의는 하지 않습니다.

      답변이 되었길 바랍니다. 즐거운 하루 되세요.

  21. chang 2011/05/14 18:07  댓글주소  수정/삭제  댓글쓰기

    안녕하세요..ㅎ 강좌 잘 따라해보고 많이 배웠습니다. 근데 너무 궁금한게 있는데요.

    1. 마지막에 동영상파일(Soas.avi)과 연결 시켜 주었잖아요? 그 부분을 동영상 대신사진파일과 연결해주고 싶으면 어떻게 고쳐조야 하나요? (동영상 말고 사진을 띄워보고 싶어서요...)
    2. 마커의 네개의 꼭지점 좌표를 구해서 그 안에서 동영상이 구동되는데 마커인식 후 마커크기 보다 크게 동영상이 표시되게 하려면 어떻게 해야 하나요?

  22. TommyHSM 2011/05/23 23:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ^^

    CV 카페에서 보고 왔습니다.

    하나하나 따라하면서 하고있는데, 질문이 있어 여쭙니다.

    마커 인식후 동영상을 틀면,

         ㅁ
         ㅁ
      ㅁㅁㅁㅁㅁㅁㅁ
         ㅁ
         ㅁ

    ㅁ-> 동영상입니다.

    위에처럼 1개가 나오는게 아니구,

    같은영상이 출력이 저렇게 되네요;;

    십자모양의 가운데가 마커부분이구요,

    중심을 기준으로 inverse가 되고, 다시 그것의 inverse가 되서

    출력이 됩니다.

    디버깅 해봐도 좌표나 다른거는 이상이 없는데 유독 저렇게 출력이 되니 답답해서 글을 적습니다.

    좀 알려주세요~

  23. 김성훈 2011/05/28 14:16  댓글주소  수정/삭제  댓글쓰기

    "밤비아빠" 님이랑 같은 증상입니다....ㅠ
    저두 윈7 이고요 동영상체크안하면 좌표 표시 잘 나오는데 동영상체크하면 좌표표시는 없어지는데 동영상 안나와요..ㅠ 첨부파일 받아서 그대로 실행 시켜봤는데도 안되네요...ㅠ
    코덱이 문제인것두 아니고.... 한참을 기다려봐도 안나오네요.

  24. 조정연 2011/07/14 16:12  댓글주소  수정/삭제  댓글쓰기

    안녕하세요ㅠ_ㅠ
    마틴님이 작성하신 강좌들을 쭉 보고 있는데요
    궁금점이 있어서요 !
    혹시 CAM이 아닌 다른기계를 사용할 경우에는
    어떻게 해야되나요 ?
    혹시 알고 계신다면 알려주세요~

    • Favicon of http://martinblog.tistory.com K. Martin 2011/07/23 01:25  댓글주소  수정/삭제

      다른 장비 어떤 것을 말씀 하시는지요?
      보통의 카메라들은 프레임그래버 등을 이용해서 이미지를 가져온 뒤 OpenCV에서 사용 가능한 형태로 변환하여 사용이 가능합니다.

  25. 흐밍흐밍 2011/08/06 18:28  댓글주소  수정/삭제  댓글쓰기

    안녕하세여 마틴님^^
    동영상 fps 때문에 질문드리는데
    RetrieveFrame 할 때 프레임 번호를 넣을수 있다고 하셨는데여
    보통 RetrieveFrame(capture) 이렇게 사용하지만
    프래임 번호를 넣을땐 어떻게 넣어야 하는지;;

    • Favicon of http://martinblog.net K. Martin 2011/08/12 11:17  댓글주소  수정/삭제

      cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 0);
      상기 함수를 이용하여 프레임번호를 설정할 수 있습니다.
      다만, AVI 파일만 적용 가능한 것으로 알고 있습니다.

  26. 최C 2011/09/27 21:23  댓글주소  수정/삭제  댓글쓰기

    너무 좋은 사이트네요

    그런데 다름이 아니라 몇몇 윗분들처럼 저도

    open cv 2.0에서 예제파일을 돌려서 참고하고있거든요...

    그런데 꼭지점부분들은 찾아서 사각형 모양이 뜨는데... 뮤직비디오를 체크하면 사각형의 선들은 사라지고 동영상이나와야하는데 동영상은 안나오고 사각형 선들만사라지네요

    동영상을 나오게 하려고 하는데 어디가 잘못된건지 찾지 못해서 글 남깁니다.

    1~8장까지는 잘 따라했거든요 그런데 동영상에서 막히네요... 꼭좀 부탁드립니다.
    티느님~

  27. 묭준 2011/10/24 19:18  댓글주소  수정/삭제  댓글쓰기

    마틴님 강의 보고 따라하고 있습니다
    다름이 아니라 위 완성 소스에
    마커 혹시 받아 볼수 있을까요??
    좋은 강의에 감사 드립니다.