티스토리 뷰

Kinect

[kinect 프로젝트] 사진 찍기

생각많은 소심남 2012. 2. 21. 12:14
계속해서 컬러스트림을 활용하는 방안에 대해서 언급해보겠습니다.
이번 시간에 할 내용은 컬러스트림으로 받아오는 프레임을 초단위로 저장하는 것에 대해서 해보고자 합니다. 

우선 사진을 찍으려면 무엇이 필요할까요?
가장먼저 지금의 상황을 나타내는 이미지가 필요할 것이고요. 그리고 특정순간을 클릭하기 위한 버튼이 필요하겠지요.
이를 wpf상에 삽입합니다.
 


xaml상에서는 별로 다룰 내용이 없습니다. 거의 전반적인 내용이 C#코드상에서 구현됩니다.
 

 
다만 이전 프로젝트와는 다르게 이미지 파일을 저장하고 불러오는 작업이 필요하기 때문에 IO에 관한 컨트롤이 필요합니다. 해당 네임스페이스를 삽입합니다.

InitializeNui()에 관한 항목도 이전과 똑같습니다. 
 


역시 ColorFrame을 뽑아내는 과정도 똑같습니다.

 
참 종료에 대한 코드를 구현한후 테스트해봅니다.
 


당연히 결과가 잘 나와야 합니다. 아래와 같이 말입니다.


그런데 한번 고려해봐야 할 부분이 있습니다.

 
지금 이렇게 지정한 src라는 변수를 ColorFrameReady 바깥으로 빼면 어떨까요? 
이론적으로 생각해보면 이렇습니다. 앞에서 나온것처럼 ColorFrameReady에서 초기화시키는 과정이 생기면 이 프레임을 호출할때마다 새로운 프레임으로 생성됩니다. 이걸 밖으로 빼놓는다면 ColorFrame이 생성되는 과정에서는 이전 프레임에 대한 정보도 갖게 됩니다. 

물론 지금과 같이 단순 이미지만을 뽑아낼때는 상관이 없습니다만.. 가령 연속된 이미지(gif같은거)가 필요할 경우에는 문제가 발생할 수도 있겠지요. 일단 외관상으로는 밖으로 빼놓는거나 안에 있는 있는거나 기능적으로 차이가 없으므로 밖으로 빼놓도록 하겠습니다.

아 그리고 다른메서드에서도 이 src를 사용하는 경우가 빈번하므로 이렇게 전역적으로 사용하기도 합니다.

자 이제 버튼에 대한 이벤트를 생성해야 합니다. 간단합니다. 그냥 wpf상에서 버튼을 더블클릭해주면 됩니다.
 


그럼 이와같이 버튼을 눌렀을때의 이벤트 폼이 형성됩니다.여기다가 이미지를 받아왔을때 저장하는 알고리즘을 구현하면 됩니다.

우선 들어가기에 앞서 이미지인코딩에 대한 클래스를 알아야 합니다.
Wpf상에서 제공하는 BitmapEncoder에는 6가지가 있습니다. 우리가 잘 알고있는 포멧인 bmp,gif,jpeg,png등으로 다 바꿀 수 있습니다. 클래스로 사용할때도 그냥 이미지포멧명+BitmapEncoder라고 사용하면 됩니다. 가령 png계열의 이미지 파일로 처리하고 싶다 하면 PngBitmapEncoder라고 사용하면 되겠지요. 이걸 사용하겠습니다.
 


버튼을 클릭했을 때의 이벤트입니다. 우선 System위쪽 부분을 보면 해당 encoder를 호출한후 그 encoder에 프레임을 쌓는겁니다. 그 프레임이 쌓여서 하나의 이미지가 됬을때는 하나의 FileStream을 통해서 전송하게 됩니다. 그럼 Test.png란 이름을 가진 이미지 파일을 만들고 그에 대해서 쓸 수 있는 권한이 부여되지요. stream이 완료되었을때는 종료가 됩니다.

마지막 세줄 부분은 Process 관련 함수로써 보통 디버깅을 해서 오류를 검출할 때 사용합니다만 여기서는 파일을 여는 형식으로 이용하였습니다. 물론 이게 실행된다면 마지막으로 사진파일이 열리겠지요. 결과물입니다.
 



nullReferenceException은 왜 발생하는지 모르겠네요. 이부분은 다시한번 봐야 하겠습니다.
아무튼 이미지 파일이 저장되고 그파일이 


디버그 폴더안에 저장되는 것도 확인할 수 있었습니다. 물론 파일이 저장되는 위치는 파일명앞에 파일 경로를 지정해줌으로써 가능합니다. 
 
여러분은 이번 포스팅을 보면서 이미지를 키넥트로부터 뽑아올 수 있었습니다. 이걸로써 응용분야는 더 넓어지게 됩니다. 사람이 Detect되면 그 사람의 모습을 담아 사진으로 저장할 수 있는 방범의 용도로도 사용할 수 있겠네요. 제가 해볼 수 있는 생각은 그정도이고 한번 구현하고자 합니다.

참고로 위에서 말한 내용들을 조합하면 이렇게도 만들 수 있습니다.
 



위의 이미지파일은 GifBitmapEncoder를 사용해서 처리했습니다. 

댓글