티스토리 뷰

Kinect

[Kinect 프로젝트] 키넥트로 사진을 찍어보자.

생각많은 소심남 2012. 5. 14. 02:29

지난 포스팅에서도 누차 강조를 했지만 키넥트는 단순히 이미지를 받아오고 내부에서 처리해서 컴퓨터에 보내주는 역할을 합니다. 그 정보를 pixelData에 담아서 넘겨주는 식으로 동작하고, 여기에 들어있는 정보를 어떻게 처리하냐에 따라서 색상을 마음대로 처리할 수 있었습니다.

 이렇게 나오는 ColorStream을 이미지 파일로 바꿀 수 있을까요? 방법은 PngBitmapEncoder나 JpegBitmapEncoder를 사용하면 됩니다. 이 프로젝트를 한번 같이 따라가고자 합니다. 우선 맨처음 ColorStream관련 포스트에서 다뤄던 프로젝트를 계속 이어서 하겠습니다.

 자 우선 xaml상에서는 우리의 상을 보여줄 이미지와 사진을 찍을 때를 표현할 버튼이 필요합니다. 그래서 다음과 같이 표현해줍니다.

 

 

그러면 디자인 뷰상에서는 다음과 같이 표현이 될겁니다.

 

 

이제 이 버튼을 눌렀을때의 이벤트를 생성해야 합니다. 물론 이 버튼을 더블 클릭하면 이벤트가 cs코드상에 자동으로 생성됩니다. 버튼을 더블 클릭하면

 

 

이렇게 버튼이 눌렸을때에 대한 코드가 자동으로 생성되는 것을 확인할 수 있습니다. 또한 xaml코드상에서도 이에 대한 이벤트가 생성된거 역시 확인할 수 있지요.

 

 

자 이제 cs 코드상의 이벤트를 작성해줘야 하는데 그전에 레퍼런스 하나를 using 지시자를 통해서 삽입해줘야 합니다. 바로 System.IO 입니다.

 

 

이걸 삽입하는 이유는 바로 이렇게 이미지를 저장하는데 있어서 필요한 fileStream을 제어하기 위함입니다. 키넥트가 컴퓨터로 전송하는 데이터를 ColorStream을 통해서 우리가 볼수 있는 것처럼 그 이미지를 이미지 파일화 시키기 위해서는 System.IO가 필요합니다. 그러면 이제 메인코드를 작성해보지요.

 

 

우선은 저장할 파일이름을 지정해야겠지요. 그리고 앞에서 언급한 fileStream를 Createnew를 통해서 filename에 해당하는 파일을 생성하게 됩니다. 그 이름은 savedSnapShot이 되겠지요. 그러면 savedSnapShot은 FileStream과 관련된 속성을 쓸 수 있겠지요. 그다음 image의 소스를 지정해주는게 필요합니다. 기존 방식을 따르자면 다음과 같이 구성됩니다.

 

 

아까 Image의 이름을 ColorImageElement로 했기 때문에 그에 대한 Source를 Image가 따르게 합니다. 이제 다음이 바로 BitmapEncoder의 사용입니다. 여러가지가 있지만 저는 pngBitmapEncoder를 사용해보겠습니다.

 

 

pngEncoder를 선언한후 각각의 frame의 BitampFrame에 더하면서 하나의 Image로 만드는 과정입니다. 그 후에 savedSnapShot에 저장하는 하나의 과정을 코드로 표현한 겁니다. 마지막으로 이렇게 한후에는 FileStream에 전달하고 남은 찌꺼기 파일이 있을겁니다. 이를 아까 언급했던 FileStream의 속성을 통해서 없애주는 것을 작성해줍니다.

 

 

참 마지막으로 이렇게 생성된 파일이 또 생기면 없애주는 동작도 구현해주고자 합니다. 그건 다음과 같이 작성해주면 됩니다.

 

 

그런데 이렇게만 해놓으면 사진을 찍었을때 파일이 생성되었는지 않되었는지를 즉각 확인할 수 없습니다. 물론 생성된 이미지파일은 프로젝트 폴더의 Debug 폴더안에 저장이 됩니다. 물론 Release 모드로 실행했을 경우에는 거기에 생성되겠지요. 그럼 생성된 이미지를 바로 확인해보려면 어떻게 해야 될까요? 그냥 열기를 하면 됩니다. 그건 다음과 같이 구현됩니다.

 

 

자 결과를 확인해보겠습니다.

 

 

아마 전에도 이런 비슷한 내용을 포스팅했을 거라고 생각하는데 저도 다시 되새기는 과정중 하나로써 언급하고 있는겁니다. 아무튼 이번 포스팅을 통해서 키넥트를 카메라처럼 쓸 수 있다 라는 걸 확인할 수 있었습니다. 여기에 지난 포스팅에서 언급한 pixelData 수정 신공을 사용하면 집에서도 영화처럼 효과를 낼 수 있는 것이지요.

 

댓글