티스토리 뷰

Kinect

[Kinect 프로젝트] 컬러스트림 추출

생각많은 소심남 2012. 2. 13. 23:55
지난 포스팅에서 Kinect Paint에 관한 내용을 다루려고 했는데 생각보다 복잡하네요.
대신 기본적인 컬러스트림을 뽑아오는 내용에 대해서 다루고자 합니다.

QuickStart 강의에서 다룬것과 달리 이번 내용에서는 순전히 Microsoft.Kinect 레퍼런스만 가지고 컬러스트림을 뽑아보려고 합니다. 

우선 기본적으로 전제해야 할 사항은 앞으로 진행될 모든 프로젝트가 WPF에 맞춰서 것이라는 겁니다.
그래서 모든 프로젝트를 하기에 앞서서 기본적으로 세팅해줘야할 사항이 있습니다.
 


우선 아래와 같이 WPF Application을 선택해주고 하단부에 있는 


솔루션 디렉토리를 만드는 것을 체크해제합니다. 별로 필요가 없는 것 같습니다.
이제 만들어집니다. 다음으로 해야될 것은 reference에 Microsoft.Kinect를 포함시키는 겁니다. 물론 앞의 포스팅에서도 다 다뤘지만 한번더 언급하자면


Add Reference를 누른후 Kinect를 검색해서 추가시킵니다. 그 후에 코딩에서는


이 항목을 추가시켜야 합니다. 여기까지가 기본 세팅이고, 뒤에서 나올 포스팅에서는 이 부분을 생략하겠습니다.

자이제 컬러스트림을 뽑기 위해서는 맨처음 코딩을 하기전에 Xaml상에서 작업을 해줘야 합니다.
우선 기본적인 xaml을 보면 가운데 MainWindow가 있을텐데 툴박스에서 이미지를 찾아서 넣어줘야합니다.


이걸 하는 이유는 그 이미지에다가 키넥트로부터 받은 정보를 넣어줄 것이기 때문입니다. 적당히 크기를 맞춘후에
코딩으로 넘어가겠습니다.

이제 해줘야 할 작업은 Initializing입니다. 여기서는 InitializeNui()란 메서드를 만들어서 
Component 후에 호출합니다. 다음과 같이 구성합니다.


여기까지는 기본적으로 키넥트를 사용할 것에 대한 초기화과정입니다. 이론상으로는 한컴퓨터에 키넥트를 4개까지 붙일 수 있지만 일상적으로 저희가 쓰는건 1개이기 때문에 사전에 [0]번 배열로 초기화시켜놓는 겁니다.
  


이 내용은 QuickStart에서도 다뤘습니다. ColorStream을 사용하기 위해서는 그걸 프로세싱하는 칩을 활성화시키는 단계가 필요합니다. 그리고 위까지 += 를 써주면 뒤에 블라블라~ 라고 뭐가 나옵니다. 여기서 탭키를 두번 따닥 눌러줍니다.
그러면 자동으로 

 
코드가 생성됩니다. 이또한 VS2010이 제공하는 편한 기능중 하나입니다. 아직 Initialize가 끝난게 아닙니다. 활성화시켰으니 받은 컬러스트림을 시작해야 합니다. 마지막으로
 


시작시켜줍니다.

이제 다룰 내용은 ColorFrameReady 이벤트입니다. 맨 처음에 ColorImageFrame에 관한 변수를 지정해줍니다. 기존에 있던 코드는 지워주시고 다음과 같이 짜면됩니다.
 


우선 ColorImageFrame으로부터 byte형 배열에 각가의 Frame을 저장하게 됩니다. 그리고 그걸 BitmapSource로 옮겨담게 됩니다.그 BitmapSource를 만들면서 필요한 정보가 받아올 이미지의 폭과 너비, 가로세로의 dpi, 그리고 어떤 픽셀형식을 쓸건지, 이미지가 담긴 배열 등을 포함하게 됩니다. 거기에 해당하는 정보를 다 넣은 겁니다. 일단 기본적으로 컬러 스트림을 받는 코딩은 다했습니다. 마지막으로
 


xaml상에서 넣은 이미지의 원천을 위의 src로 지정하면 끝입니다. 마지막으로 몇가지 작업을 더해볼까요?
우선 위까지 하면 실행은 되지만 코딩이 끝난후에도 키넥트가 계속 동작하는 것을 확인하실 겁니다. 이를 막기 위해서는 앞의 포스팅에서도 설명했지만 kinect의 동작을 멈춰야 합니다. 다음과 같이 이벤트를 하나 생성합니다.

Properties에 보면 Event항목이 있습니다.MainWindow를 선택한 상태에서 Event를 본후 Closing이라고 검색한 후 더블클릭하세요.


그럼 역시 코드상에서 새로운 이벤트가 생성됩니다. 여기에 멈추는 코드를 삽입합니다.


 새로 생성된 이벤트에는 StopKinect라는 메서드를 삽입하고 그에 해당하는 동작을 담았습니다. 이렇게 하면 디버깅 종료후에 키넥트도 정상종료됩니다. 

결과는
 


와 같이 컬러스트림을 정상적으로 빼올 수 있습니다. 이를 조금더 응용하면 다음과 같이도 구성할 수 있습니다.

 
이른바 잔상효과도 구현할 수 있습니다. 하지만 이부분을 다루려면 Timestamp 기능을 활용해야 되기 때문에 다음 포스팅에서 그 부분을 언급해보도록 하겠습니다. 


댓글