티스토리 뷰

Kinect

[kinect 프로젝트] FrameCount 측정

생각많은 소심남 2012. 2. 20. 18:21
1주일간의 키넥트 프로그래밍 교육을 마치고 다시 정리해보고자 합니다. 이번 프로젝트도 역시 wpf로 작성합니다. 들어가기에 앞서서 이전 포스팅에서 언급된 사전작업을 해주셔야 합니다.

일단 디자인뷰를 보면 횡합니다. 여기에 이번 시간의 목적인 FrameCount를 출력하는 TextBlock이 필요하겠지요. 물론 키넥트에서 받아올 이미지를 뿌릴 이미지 컨트롤도 삽입해야 하고요.


그냥 toolbox에서 해당 컨트롤들을 드래그엔 드롭 형식으로 가져오면 됩니다. 이제 코드를 볼 차례군요.

우선 MainWindow 상에서 Nui를 초기화시키는 과정이 필요합니다. 이를  initializeNui란 메서드로 정의가 필요하고 이를 구성하는 함수를 작성합니다.
 


여기도 역시 Colorstream을 뽑아내는 것이 필요합니다. 그래서 그 기능을 담당하는 것을 활성하고 이벤트를 활성화시킵니다. 지난 시간에도 언급했던 것처럼 위와 같이 +=를 한 후에 탭키를 두번 연속으로 누르면



와 같이 관련 이벤트를 자동으로 생성해줍니다. 매우 편리한 기능이지요. 마지막으로 Kinect센서를 동작시켜주는 start() 메서드를 삽입함으로써 MainWindow의 동작이 마무리됩니다. 

ColorFrameReady 이벤트도 지난 시간과 똑같이 형성됩니다. 다만 이 이벤트에선 지난시간에 한것에서 하나를 더 추가해야 합니다.
  



바로 ColorStream으로부터 시간을 뽑아낼 메서드를 생성하는 겁니다. 이 부분은 따로 생성해야 합니다.


우선은 받아온 이미지 프레임으로부터 프레임넘버를 받아올 수 있습니다. 그리고 시간별로 이 값이 기록되기 때문에 진행시간역시 Timestamp를 통해서 불러올 수 있습니다. 그래서 앞에서 설정한 MainWindow에선 textBlock1에는 프레임 숫자, textBlock2에는 진행시간이 기록될 겁니다. 하지만 이 값들은 우리가 원하는 값이 아니겠지요. 우리가 원하는 값은 1초당 프레임이 얼마나 나오느냐, 즉 FPS(Frame Per Second)를 구할 수 있어야 합니다. 보통 영화로 우리눈에 보이는 fps가 24fps입니다. 그 이상만 넘어간다면 사람의 눈에는 실제로 사물이 자연스럽게 움직이는 것처럼 보이는 것이지요.
 우선 구할 수 있는 fps는 지금까지 나온 총 프레임을 경과시간으로 나눈 평균 fps와 1초사이의 프레임변화를 측정할 수 있는 순간 fps가 존재합니다. 평균 fps는 말 그대로 그냥 FrameNumber를 timestamp로 나눠주면 되겠지요. 코드상에서는 다음과 같이 구현했습니다.


중간에 조건문이 들어간 이유는 초기에 시작할때 lTime은 0으로 설정되기때문에 lRes를 구할때는 0으로 나누는 상황이 발생하게됩니다. 이때는 그냥 lFrame으로 나눠줌으로써 오류가 발생하지 않게끔 되는 겁니다. 그러니 초기에 아주 순간동안은 잘못된 값이 나오겠지요. 그 값이 lRes로 저장되어 textBlock3로 넘어가게 됩니다. 다음은 순간 fps입니다.

순간을 구하려면 어떻게 해야 할까요? 그럼 1초일때만 fps를 따로 구하면 되겠지요. 그럼 필요한 것이 시작때의 frame과 측정 종료시의 frame이겠지요. 어차피 시간은 1로 나눠주니까 수식에서는 필요가 없을 겁니다.


마지막으로 전역적으로 SaveTime과 SaveFrame을 쓸 수 있게끔 변수 설정을 해줍니다. 그럼 FramePerSecond() 메서드는 다음과 같이 구성되겠지요.


자 지난번에도 언급한 것처럼 이렇게로만 끝내면 키넥트가 정상종료하지 않습니다. 따라서 Windows가 꺼졌을때의 이벤트를 생성하고 그에 관련해서 키넥트를 종료하게끔 메서드를 만들어야 합니다. 이벤트 생성이야 여러분들도 다 하실 수 있겠지요?
 


 실행하면 다음과 같은 결과가 나옵니다. 

 
보다시피 평균 fps와 순간 fps가 약간의 차이가 나타나는 것을 확인할 수 있습니다.

fps 게임 많이 해보셨나요? fps게임에도 각각의 fps를 잴 수 있는 툴이 존재합니다. 저같은 경우는 프레임카운트 측정시 Fraps라는 툴을 사용하기도 합니다. GPU를 많이 쓰는 화면,즉 영상처리가 많이 필요한 구간에서는 순간적으로 fps가 팍 줄어들지만 그렇지 않은 구간에서는 fps가 부드럽게 유지됩니다. 그런 원리로 평균 fps와 순간 fps간에 차이가 있는 걸 알아두셨으면 합니다. 다음 파트에서는 키넥트를 이용해서 사진을 찍는 것을 해보겠습니다.

참고로 지난 포스팅에서 잠깐 언급했던 1초 프레임을 저장시키는 기법도 여기서 나온 방법을 응용한 겁니다. 

댓글