최근 영화나 게임등을 보면 사람 얼굴을 묘사하는 기술이 비약적으로 발전한 걸 알 수 있습니다. 물론 이런 기술은 컴퓨터 그래픽(CG)을 이용할 것입니다. 어떤 기술을 사용하기에 정말 사람과 같은 컴퓨터 그래픽이 가능한 지 알 수 있을까요?

최근 uxfactory에 황리건님이 디자인, 창조성에 관한 TED 비디오 모음이라는 글을 올려주셨습니다. 이 글에는 TED 비디오가 2개 소개되어 있습니다. 이중 처음 비디오는 Paul Debevec animates a photo-real digital face 입니다. 이 비디오는 한국어 자막도 제공되고 한국어 소개 페이지도 있습니다. 무엇보다도 비디오가 6분 6초로 짧습니다. 디지털 영상에 관심있는 분들은 짧은(?) 시간을 투자하여 한번쯤 볼만합니다. (한국어 자막을 보려면 임베딩된 비디오에서 재생 버튼 옆에 있는 빨간색으로된 View subtitles를 눌러서 Korean을 선택하면 됩니다.)



Paul Debevec은 위의 비디오에도 소개되어 있지만 USC Institute for Creative Technologies의 그래픽스 실험실에서 Light Stage system 개발을 지휘하고 있습니다. 이 분은 사람 얼굴을 리얼하게 표현하는 CG 분야에 많은 연구를 하고 있습니다. 



대표적으로 인상적인 프로젝트는 얼굴 스캔과 디지털 에밀리 프로젝트를 위한 얼굴 스캔(High Resolution Face Scanning for "Digital Emily")입니다. 위 비디오에 소개된 내용입니다. 위의 비디오에 소개된 관련 기술 및 실제 촬영 장면, 작업 과정과 관련 논문, 고화질 비디오 등을 자세히 소개하고 있습니다. 관심있다면 한번쯤 둘러 보십시오. 위의 TED 비디오보다 자세한 비디오도 여럿 소개되어 있어 재미있을 것입니다. 

내가 보기에는 실제 찍힌 사진과 합성된 영상이 거의 구분이 되지 않는 수준까지 왔습니다. 하기야 최근 영화에 등장하는 특정 캐릭터들은 CG 작업을 했지만 분간이 되지 않는 수준이기는 합니다. 위의 비디오 마지막에도 소개되었지만 앞으로는 얼굴만이 아닌 인체 전체를 동영상 합성하는 기술이 적용될 것입니다. Paul Debevec은 이미 2006년부터 Relighting Human Locomotion with Flowed Reflectance Fields을 발표하고 있습니다. 촬영 설비와 배경 기술 등 자세한 내용을 보고 싶으면 링크되어 있는 프로젝트 페이지를 참고하십시오. 최근 3D 디스플레이와 관련된 관심이 높은데 관련 기술 개발에 상당한 진전이 있는 것 같습니다.


그의 홈페이지에는 빛과 사진에 대한 많은 연구 내용을 소개하고 있습니다. 디지털 영상에 관심이 있다면 한번쯤 시간을 내서 둘러볼 만합니다. 아무튼 대단한 분입니다. ^^;


사진은 USC의 Institute for Creative Technologies의 그래픽스 실험실에 있는 프로젝트 소개 페이지에서 ...

신고

'비디오' 카테고리의 다른 글

디지털 얼굴 합성  (0) 2010.04.21
top

Write a comment


보통 Win32 API를 이용해서 thread 생성할 때 CreateThread()를 사용한다. 그러나 C run-time library를 사용할 때는 _beginthread()나 _beginthreadex()를 사용해야 한다. MSDN (http://msdn.microsoft.com/en-us/library/7t9ha0zh(v=vs.71).aspx) 에 이 내용이 설명되어 있다. 여기서 중요한 점은 thread 내에서 C run-time library를 사용하는 데 CreateThread()를 사용하면 리소스 누수가 발생한다는 것이다. 이는 프로그램 로직 상에는 아무 문제도 없는 데 메모리 누수(leak)등 쥐도 새도 모르는 문제점이 발생할 수 있다는 것이다.

CreateThread()를 사용했던 코드라면 _beginthreadex()를 사용하는 것이 좋다. 그러나 시작 루틴의 주소등 몇 가지 파라미터가 정확하게 일치하지 않아서 형변환을 시켜줘야 한다. 다음은 CreateThread()와 _beginthreadex()의 기본형이다.

HANDLE WINAPI CreateThread(
  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes,  
  __in       SIZE_T dwStackSize,  
  __in       LPTHREAD_START_ROUTINE lpStartAddress,  
  __in_opt   LPVOID lpParameter,  
  __in       DWORD dwCreationFlags,  
  __out_opt  LPDWORD lpThreadId
);

uintptr_t _beginthreadex( // NATIVE CODE
   void *security,
   unsigned stack_size,
   unsigned ( __stdcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr 
);
thread를 종료할 때에도 주의할 점이 있다. _beginthread()는 그냥 thread 루틴에서 리턴을 하면 자동으로 _endthread()가 호출되고 thread 루틴에서 사용되었던 자원들도 반환된다.
_beginthreadex()로 시작된 thread는 thread 루틴에서 리턴하면 자동으로 _endthreadex()가 호출되고 자원이 반환된다. 그러나 _beginthreadex()가 호출될 때 생성된 thread HANDLE은 반환되지 않는다. 따라서 CloseHandle()을 호출하여 명시적으로 닫아줘야 한다.

예제 코드는 MSDN의 http://msdn.microsoft.com/en-us/library/kdzttdcb.aspx 페이지를 참고한다.

신고

'프로그래밍' 카테고리의 다른 글

CPU 정보를 어떻게 알 수 있을까?  (0) 2010.04.23
Win32 API Multithreading 시 주의점  (0) 2010.04.20
top

Write a comment





티스토리 툴바