2018년 10월 1일 월요일

[2011. 8. 25] Match moving... 합성을 위한 실사 이미지 시퀀스의 카메라 트래킹...

Match moving , camera tracking 등 여러 단어로 묘사되곤 하는데, 실사 또는 3D 소프트웨어에서 렌더링된 이미지 시퀀스도 트랙킹이 가능하고요...
 이와 같은 이미지 시퀀스에서 트랙킹(추적을 하는 것인데, 어떤 정해진 지점 등을 주로 추적하게 됩니다. 차후 설명...)을 통해서, 한 shot의 이미지 시퀀스로 부터 역으로 이 시퀀스를 생산한 카메라(실사, 3DCG의 가상카메라 등)의 움직임이나 초점거리(줌인 줌아웃:focal length)등을 추적해 낼 수 있는 것입니다...
 이렇게 카메라를 추적해 내게 되면, 이 정보를 3D CG 소프트웨어의 가상카메라에 연결하면, 이 3D CG 소프트웨어안에서 만든 CG애니메이션을 이 가상카메라로 렌더링 했을 경우에, 위에서 기존에 카메라를 추적해냈었던 이미지 시퀀스와 합성할 때, 이미지 시퀀스를 찍은 카메라와 3DCG를 렌더링한 카메라가 일치되므로 합성이 이루어졌을 때, 자연스럽게 합성되도록(특히 그 카메라로 인한 움직임이) 만들 수 있는 것이죠...

 이론상으로는 그렇습니다만, 아주 완벽하지는 않고, 그래도 서로 합성 했을 경우, 눈치채지 못할 정도록 잘 붙어있도록은 됩니다... 핸드헬드 카메라로 찍은 이미지시퀀스와 합성 했을 때, 3DCG 오브젝트가 미끌어지는 느낌이 거의 없거나 최소화 되게끔 되죠... 한 두 픽셀, 또는 몇 픽셀 정도의 차이는 경우에 따라 잘 느껴지지 않습니다...

일단 추적이 가능한 원리를 보도록 하겠습니다...
다음과 같이 촬영한 장면이 있다고 하면요...










그림을 보면 3D CG 장면 이지만, 어차피 실사도 마찬가지라고 보시면 됩니다.
첫번째 이미지는 카메라의 초기(움직이기 이전)장면 이고, 캐릭터 부분을 초점 축으로 해서 패닝이동하게 됩니다... 두 번째 이미지는 첫번째 이미지에 카메라가 움직이고 난 이후의 장면을 겹쳐놓았습니다...
위 장면에서 카메라의 초점 축은 당연히 거의 움직임이 없고(로테이션은 있겠지요...) 그 중심축으로 부터 거리에 비례해서 멀리 있는 물체는 더 많이 움직일 것이고, 중심축에 가까운 물체는 상대적으로 덜 움직일 것입니다... 중심축에 아주 가까운 캐릭터는 로테이션은 되었지만, translation 움직임은 거의 없죠...
이는 누구나 알고있는 상식일 것입니다...
이 상식을 이용해서 이미지시퀀스에서 위의 예와 같이 상자들이 이미지시퀀스의 시작과 끝에 걸쳐 어떻게 움직였는지를 정확하게 트랙킹(추적)해 낸다면, 이로 부터 카메라의 움직임을 계산하여 유추해 내는 것이 가능해지는 것입니다...

이렇게 이미지 시퀀스의 어떤 지점(위 경우는 상자를 예로 들었지만, 어떤 이미지 상의 spot 이 주로 사용됩니다.)이 움직여간 경로를 한프레임 한프레임 추적해서 뽑아내는 것을 tracking 이라고 합니다.
tracking에 대해서 좀 더 설명을 드리자면, 십자모양과 같이 각이 있고, 그것이 그 주변과 명암이나 색깔 차이가 분명할 때, 트랙킹이 잘 됩니다... 컴퓨터가 명암이나 색차이를 보고 추적하기 때문이죠...
그리고 일반적으로 툴에서 회전을 트랙킹하지는 않습니다... 저는 처음엔 어떤 쉐입의 모양이 카메라각에 따라 달라질 것이기에 그것을 추적하면 정확할 것이니까, 그렇게 작동하지 않는가 했는데, 아니더군요...(maya match mover 와 nuke의 경우... 다른 소프트웨어에서는 가능할 지도 모르지만요... 또는 앞으로 기능으로 추가될 여지도 있고요...)
정해준 지점의 움직임만 추적하는데, 그로인하여 90도로 꺽어진 모서리 등이 가장 잘 트래킹됩니다...















그린 매트를 촬영할 때도 위 그림처럼 십자표시를 많이 사용하는 이유는 바로 트래킹이 잘 되기 때문입니다.
위와 같은 경우 저 십자표시들을 트래킹해서 카메라의 이동에 따라 서로 움직이는 것이 달라질 것이기에 그로부터 카메라의 움직임을 solve한다고 얘기하는데, 계산해 내는 것입니다...
그러고 나면, 카메라 움직임과 기타치는 캐릭터들과 그들이 올라타고 있는 것의 실사 이미지를 얻게 되고요...
CG에서 그린부분에 들어갈 배경을 뉴욕의 길거리를 만들던 사막의 고속도로를 만들건 제작하고, solve한 실제 카메라 움직임을 가진 CG카메라를 통해 렌더링 한 이후 합성해 주면, CG로 만든 배경이 그린 부분을 대체하고, 새로운 장면이 탄생하게 되는 것입니다.

이러한 관계로 앞으로 제가 실제 하고 있는 작업을 가지고 예를 보여드리게 되겠지만, 트래킹할 지점들이 가까이 있는 것과 멀리 있는 것 등으로 분포되어 나뉘어져 있는 것이 카메라를 solve할 때 용이합니다...
가까이 있는 것들만 트래킹하여 solve하면 당연한 얘기지만, 트래킹한 지점의 움직임이 거의 비슷해서 이상하게 solve되어 나오는 경우가 많습니다.
다음으로는 CG가상공간으로 옮겨질 때, 좌표축과 Scene 사이즈 등을 맞추기 위해서 트래킹 지점들의 사전준비를 하고 촬영하는 것이 좋습니다...
예를 들어 X,Y,Z 축을 나타내기 위해 해당 정확히 해당 축상에 위치할 수 있는 트래킹 지점들과, 두 트래킹 지점상의 거리를 알고 있어야 하는 것 등이죠...

이제 제 작업을 가지고 실제 트래킹을 한 번 해보겠습니다. ^^ 
사실 저도 maya live 시절에 카메라 트래킹을 첨 시작해 봤는데요 위와 같은 사전지식이 없었을 때는 제대로 solve되지 않아서 고생을 많이 했죠 ^^
특히 트래킹할 지점들이 카메라를 기준으로 깊이가 가깝고 멀게 분포되어 있어야 합니다...
현재 작업은 제 작업책상이 무대이어서 이를 촬영했습니다...
해상도와 색상화질이 더 좋은 카메라로 하면 좋겠고, 또 그렇게 해야 되겠지만, 제가 가진 카메라가 오래된 홈비디오 카메라인 sony TRV30 입니다...
iPhone4 등의 해상도가 720p인 관계로 더 좋을 수도 있습니다... 다만 제가 촬영해본 느낌은 아무래도 아주 오래된 비디오카메라이지만, TRV30의 센서가 오히려 좀 더 나아보이는 듯 해요... 낮은 조명 하에서 말이죠... 그리고 줌인줌아웃(focal length가 달라지죠) 이 되는 점도 있고요... 10x 줌이 됩니다.
촬영할 카메라에 대해서 사전에 정보를 가지고 있어야만 합니다...
해상도, 프레임레이트, 렌즈 focal length, Progressive or interlaced 등등...
제 TRV30은 TV재생이 목적이었기에 불리한 점이 많습니다... 물론 Match mover에서 field option, 29.97fps 등 지원은 합니다만...
[TRV30]
720*480 / 29.97fps / 35mm 카메라로 환산해서 48mm ~ 480mm / interlaced (lower first)
아래 이미지와 같은 이미지 시퀀스를 촬영해서 얻었습니다...
여기에서 문제가 있는 것이 제 카메라가 홈비디오용이다 보니 720*480의 해상도라는 것입니다...
픽셀Ratio 도 1:1 아닌 0.9091입니다... 픽셀 하나의 가로세로가 정사각형이 아니라 가로길이가 세로 길이에 비해 그만큼 작은 것입니다... 그러기에 4:3 화면비의 해상도가 640*480이 아닌 720*480이죠... 당시의 NTSC베타캠같은 경우 720*486(마야의 CCIR601/Quantel NTSC)인데, 예전에 저도 방송국작업할 땐 이 해상도로 하곤 했는데... 지금은 다들 기본적으로 HD 720p, 1080i 또는 1080p 등을 쓰고 영화용으로 2k, 4k 등 고해상도로 하지만요...
저는 어쨌거나 일반 컴퓨터 모니터로 볼 수 있도록 하려고 최종 결과물은 640*480으로 하려고 생각하고 있기 때문에... 캠이 HD였다면, 제 시스템성능을 고려해서 720p정도로 하고 싶긴 한데요... :(  그래서 프리미어에서 NTSC field도 flicker removal 로 프로그래시브로 만들어 버리고, 29.97은 유지 하는 것이 좋기에 유지하고, 픽셀Ratio를 0.9091 이 1이 되도록 했습니다....
그렇게 하면, 720*480에서 가로로 눌려서 654:480 이 되더군요...


그리고 이미지 시퀀스를 트래킹이 잘 되도록 contrast를 올린다던지 등으로 색보정을 해주면 더 좋습니다...
그리고 match mover나 Nuke X(Camera Tracker:같은 것이 애프터이펙츠 플러그인으로도 있는 것 같습니다.), PFTrack, Bojou 등등 많습니다..
저는 일단 마야와의 호환도 좋고, 제가 익숙하기도 하고 해서 Match mover를 많이 씁니다.
Maya Live 일 때 보다는 훨씬 좋아진 것 같습니다...

일단 이러한 camera tracking 툴들이 일반적으로 가진 기능을 보면, 수동으로 tracking 지점을 지정하고 일일히 트래킹한 이 후에 camera solve를 하는 수동방법이 있고요...
(전 match mover로 이걸 많이 씁니다만... 일반적으로 그린 매트 등등 촬영당시 부터 의도적인 표시가 있는 경우에 많이 쓰이고 유용합니다...)

다음은 튜토리얼 등에 많이 나오는 automatic tracking 방법인데, 컴퓨터가 자동으로 수많은 지점들을 명암차, 색상차 등을 이용해 찾아내서 트래킹 하고 solving 하는 방법입니다... 정확도는 떨어지는 듯 합니다만, 그린 매트 같이 아주 의도적이지 않고, 일반적으로 촬영한 경우 나름대로 solving이 됩니다... 물체를 붙여보면, 붙어있는 느낌이 납니다... 물론 트래킹한 지점들을 3D공간과 촬영공간을 비교해서 살펴보면, 차이가 많이 나긴 합니다만... 렌즈 distortion(왜곡), 정확한 focal length등의 적용으로 최대한 실제에 가깝게 만들수는 있습니다...
그리고 의도적이지 않다고 하긴 했으나, 염두해두고 어느정도 트래킹이 될만하게 촬영을 하고, 또 그렇게 구성을 해야만 잘 됩니다...

또 match mover 같은 경우는 레퍼런스를 두고 그 형상의 카메라 움직임에 따른 변화와 트랙들을 비교해서 solve하는 것도 있습니다...

또 match mover에 있는 다른 하나의 기능은 모션캡쳐 기능으로 Camera tracking은 아닙니다만... 고정된 두대의 카메라를 동시에 움직이는 물체를 촬영해서 그 움직인 물체의 특정지점(인위적으로 tracker를 두는 경우가 많습니다. 얼굴모션캡쳐 하는 것과 마찬가지로)의 시퀀스상의 움직임을 두 대의 다른 각도 촬영을 비교하여 3차원 공간으로 캡쳐해 냅니다... (어찌보면, 멈춰있는 트랙들로부터 카메라를 solving하는 것과 반대로 고정된 카메라를 통해 오브젝트의 모션을 캡쳐하는 것입니다.)


match mover 화면 입니다.
멀리 있는 것들도 트래킹할만 한 것들이 있도록 scene를 촬영전에 잘 배치해야 합니다...
처음엔 모니터에 가려져 있고, 핸드폰 있는 정도가 가장 먼 거리로 tracking할 만 한 것이 있는 정도였는데, 카메라 solve가 흡족하게 되지는 않더군요...
그래서 위와 같이 재촬영했습니다... 사실 멀리있다고 하는 것이 위 이미지 상으로는 그다지 멀어보이지 않는데, 실제로는 가까운 것과 핸드폰과의 거리보다도 더 멀리 떨어져 있습니다... 카메라 촬영각도 때문에 가까워 보이지만요... 
그리고 모션블러, 피사계심도 블러효과라거나 렌즈플레어 등 광원 효과 라거나 등등은 없는 것이 좋습니다... 당연히 tracking 에 방해가 되기 때문이죠...
 필요한 경우 후반작업에서 넣어 주어야 겠죠... 그러기에 매트 촬영등으로 scene을 아예 재구성 하는 것이 여러모로 좋긴 합니다만...
그리고 가까운 것들이라고 제가 표시한 3개의 track들은 사실 제가 임의로 표시해서 만든 것인데, 너무 눈에 띄면 인위적이라 표시가 나겠지만, 저는 일단 편하게 작업했습니다... 나중에 nuke 등에서 지울 수도 있고요...
어쨌든 이들은 solving 이후에 좌표를 가리킬 지표가 됩니다... x축이 될 수 있고요... 그 거리는 10cm 입니다... 바로 뒤의 두 점과 Z축을 형성하게도 되고요...
Tracking은 16개를 했습니다...

사실 위의 것으로도 solve 해 봤을 때, 잘 됐습니다만...
여기에 autotracking을 sensitive와 density를 가장 약하게 줘소 autotracking 수를 최소화 해서 기존의 수동 track들에 더해서 solving 했습니다...
autotrack을 더하는 것이 항상 좋은 결과를 가져오는 것은 아닙니다... 많은 경우에 오히려 잘못된 결과를 가져와서 축이 이상하게 되어 돌아간다거나 마구 떨린다거나 등등의 문제를 야기시키는 경우가 많습니다...
그래서 autotrack 수를 최소화 하고, 자동이라도 50프레임이상 트래킹되는 트랙들만 적용하게 해서 solve한 결과 괜찮은 결과를 얻었습니다...

[아래 영상을 보세요]
http://blog.naver.com/sspsos74/20136247563

아래 이미지는 같은 것을 NUKE X에서도 시험삼아 해봤습니다... 나쁘지는 않게 나오더군요... 동영상을 뽑지는 않았습니다만...


match mover 에서의 결과물로 계속 작업을 할 것이고요...
다음은 마야에서 캐릭터를 일단 불러만 놓고 playblaster로 영상을 만들어 봤습니다...

http://blog.naver.com/sspsos74/20136247563

이제 Scene과 Camera solve도 다 되었고, 캐릭터도 올렸으니 애니메이션, lighting 그리고 rendering setup 등을 해 나아가면 될 것입니다...
여기에서 위에서 이미지 시퀀스가 654*480이 되었는데, 마야에서는 640*480으로 렌더링 되도록 마야 카메라 attribute editor와 render setting에서 설정하였습니다...
이렇게되면, 654 -> 640 되는 만큼 가로화면이 잘려나가는데 크게 문제되는 것은 없기에 그냥 잘라내기로 했습니다...


[추가 정보] 
더 작업을 진행하고서 추가적인 정보를 올립니다...
위에서 말씀드렸듯이 720*480에서 해상도 변경하고 flicker removal 등을 주고 interlace를 progressive로 작업하는 등의 작업이 물론 안되는 것은 아닙니다만...
(일단 기본적으로 최근의 비디오캠은 HD에 프로그래시브가 기본인 것이 많아서 위와 같은 수고를 할 일도 없긴 합니다만...) 
flicker removal을 주면, 픽셀들이 좀 뭉그러집니다... 이것이 Match mover 등의 카메라 트랙킹 툴에서 트래킹을 수행함에 있어, 좋지않은 문제를 발생하기도 합니다...
차라리 interlaced 상태로 작업하는 것이 나은 것 같습니다... 
다음으로 픽셀 레이셔(Pixel ratio)문제인데요... 컴퓨터와는 달리 1:1 이 아닌 0.9091의 pixel ratio를 갖다보니 720*480의 해상도를 갖는데 위에서 한 것 처럼 654*480으로 할 수도 있겠습니다만... match mover에서 설정을 통해 720*480에 pixel ratio를 0.9091의 세팅으로 하고 이것이 마야로 넘어갔을 때도 그대로 유지되게 하는 것도 가능합니다...
즉, 마야에서 위의 설정인 채로 렌더링을 해보면, 렌더링된 이미지가 약간 가로로 퍼져나오게됩니다... 
그래야 NTSC 설정인채로 TV(기존 아날로그)에서 보게되면, 정상적인 4:3 이미지로 나오게 되죠... 
사실은 이상태로 작업하고 렌더링해서 최종편집툴(프리미어 같은)에서 렌더링 퀄리티를 640*480 등으로 해서 4:3으로 만드는 것이 정석이라고 할 수도 있겠습니다... 
저도 그렇게 작업하고 있습니다... 

좌측의 이미지에서 보듯이 Camera의 세팅에서 720*480 의 해상도는 이미지 시퀀스를 로딩할 때 자동으로 잡히는 것이고요... Advanced 탭에서 Pixel Aspect Ration 를  0.9091로 고정시키면 됩니다...
Ratio 도 1.500 으로 잡혀있는 것이 보이고요... 

이러한 세팅이 마야로 export 했을 때도 카메라 세팅에 자동으로 잘 넘어와 있게됩니다... 

















또 Match mover에는 위에서 다룬 이상의 기능들이 있습니다... 
트래킹포인트 들의 관계를 설정한다거나... 예를 들면 어떤 바닥의 포인트들을 트래킹했을 경우 그 포인트들은 실제로 y축 상의 값이 같다고 할 수 있겠죠?  영상을 찍은 사람은 그 사실을 알고 있지만, 이미지시퀀스를 통해 값을 얻어내는 Match mover는 정확하게 계산해 낼 수도 있겠지만, 실제 값이 그러하다는 사실을 입력해 준다면, 더 정확한 트래킹이 가능할 것입니다... 그런 도움을 주는 것입니다... 바닥뿐만 아니라 벽과 같은 경우는 Z축이나 X 축으로 값이 같은 트래킹포인트 들이 있을 것입니다.. 이들도 설정하는 것이 가능합니다...
또한 카메라가 이동하는 움직임이 아주 적거나 없이 로테이션만 된다거나 하는 경우는  트래킹이 잘 안되는 경우가 많습니다... Parallax 라고 하는데, 시차 즉 시점의 차이 다른 시점에서의 뷰가 있어야 카메라의 움직임, 변경 값을 더 정확히 계산해낼 수 있는데, 그 시점이 적으면, 이미지시퀀스를 통하여 카메라의 변경값을 계산해 내기가 쉽지 않습니다...
 물론 매치무버에서 처음에 이미지시퀀스를 로딩할 때, 카메라의 움직임이 어땠는지를 설정해 줄 수가 있긴 합니다만..(카메라의 모션을 Free / Nodal pan / Fixed / Dolly X,Y,Z / Planar on XY, YZ, XZ) 그래도 Camera Solve 가 잘 안될 때가 많습니다.
이 때를 위해 Helper Image 라는 것을 사용할 수도 있습니다... 다른 카메라 각도에서 찍은 영상(그러나 같은 씬을 촬영해야 겠죠...) 즉, Parallax 시차가 있는 이미지시퀀스를 로딩해서 이를 카메라 솔브 하는데에 도움을 주는 참고영상이 되는 것입니다...


위 그림에서 볼 수 있듯이 Helper Image를 촬영하여 Camera Solve 시에 참고로 도움을 줘서 훨씬 정확한 카메라 트래킹이 가능하게 할 수 있습니다...
C 와 D 같은 형식이거나 C1 과 D1 과 같이 할 수 있는데, 그 의미는 트래킹할 카메라 씬이 A-B (이것은 한 카메라가 그렇게 이동했다는 뜻입니다) 일 때, 그 카메라가 담은 씬 장면을 포함한 Helper Image가 필요하다는 것입니다...
뭐 이는 당연한 소리겠죠... ^^ 딴장면 찍은 화면을 가져다 놓고 Helper Image라고 할 수 없는 거니까요... 
 사용 방법은 Helper Image 시퀀스를 이미지 시퀀스 이후에 같은 방법으로 loading 하면, 타임라인 상에 연이어 나타납니다... 그렇지만, Match mover는 그들이 다른 시퀀스인것을 알고 있습니다...
기본 이미지시퀀스에서 트래킹한 포인트들이 helper image sequence 에도 보여지고 있겠죠? 이들을 트래킹해 주면, 다른 시점에서는 그들 트래킹포인트 들이 어떻게 분포된다는 것을 고려해서 Camera가 어떻게 이동되고, 변경되었는지를 더 정확하게 solving하는 것입니다...


댓글 없음:

댓글 쓰기