티스토리 뷰

Kinect

[Kinect Study] (1) Kinect QuickStart - Camera Fundamental

생각많은 소심남 2012. 9. 20. 01:31

9월 19일 저녁에 두번째 세미나가 진행되었습니다. 물론 저도 잘 아는 것이 아니기에 강의가 아닌 스터디 형식이었지요. 아무튼 공지했던 대로 스터디 내용을 제공해드립니다.



오늘 한 내용은 올해 2월에 Channel 9에서 공개되었던 Kinect for Windows QuickStart 의 1.5 버전입니다. 물론 별로 강의하는데서 차이가 있는 건 아니지만 내부의 내용물은 v1.5로 개편해서 소개했습니다. 강의 템플릿역시 그때 쓰였던 자료입니다.



그중 처음으로 소개한 내용은 키넥트의 개발 환경 및 이번 QuickStart를 통해서 언급하게 될 내용의 OverView였습니다. 물론 키넥트가 내손에 있고 개발할 의지가 있는 것 만으로도 이 과정은 그냥 뛰어 넘어도 괜찮다고 생각합니다. 



그때 QuickStart에서는 위와 같이 총 6개의 분야에 대해서 설명했었고, 제가 오늘까지 진행한 부분은 Camera Fundamental까지였습니다. 주로 다룬 내용은 Channel 9에서 제공하는 Toolkit인 Coding4fun을 사용한 쉬운 키넥트 개발이었고, 기본적으로 키넥트의 스펙과 전체적인 코드 구성을 다뤘습니다. 물론 아직은 개발에 이르기는 조금 힘들거 같아서 코딩 실습은 배제했습니다.



자 키넥트는 위와 같이 IR Set과 RGB Cam, 그리고 4개의 마이크로 구성되어있습니다. 추가적으로 높낮이를 조절할 수 있는 tilt 모터가 내장되어 있어서 상하로 27도 씩 움직일 수 있습니다. 마이크가 4개가 있다는 것은 무엇을 의미할까요? 우선 마이크는 공기중을 통해서 전달하는 소리를 감지하고 컴퓨터에 전달합니다. 하지만 이 소리는 4개의 마이크에 똑같이 전달되는게 아니지요. 놓여있는 위치가 다르니까 각 마이크가 느끼는 magnitude도 다를 겁니다. 이를 통해서 소리의 진원지가 어느쪽에 위치해 있는지 알 수 있고 또 소리가 전달되는데 걸리는 시간을 통해서 대충 발원지가 어딘지를 감을 잡을 수 있는 거지요. 오디오에 관한 샘플은 3개가 제공되고 다음과 같습니다.



첫번째 sample은 Audio Basic이고 D2D(DirectX2D),C#,VB에 관해서 제공됩니다. 이건 단순하게 소리의 발원지에 대한 키넥트가 인식하는 각도와 소리의 강도를 측정할 수 있는 프로그램입니다. 이런식으로 소리가 어느위치에서 나는지를 확인할 수 있습니다.



두번째 샘플은 C++로 제공되는 녹음기 입니다. s를 누를때까지 음성들을 녹음해서 음악폴더에 저장시켜줍니다. 이건 전에 키넥트 섹션에서도 다룬바가 있습니다.



제가 인상깊게 본건 이 마지막 샘플인 Audio Explorer입니다. 보면 음성에 잡음을 방지하는 필터를 적용할 수 있습니다. 신호처리를 배우신 분들이라면 잘 아실 Hemming Filter라던가  Rectangle Filter를 적용시킬 수 있습니다. 그러면 음성 인식이 조금더 깔끔하게 인식이 되지요. 이밖에도 Echo 방지도 적용할 수 있는 등 음원에 대한 설정을 키넥트로 할 수 있는 예제입니다. 저도 처음해봤는데 많이 신기하더군요.



자 개발환경입니다. 우선은 키넥트가 있어야 하겠고, 당연히 키넥트로 개발하기 위한 SDK를 설치해야 합니다. 바로 며칠전에 이에 관해서 포스트로 정리한게 있으니 참고하시기 바랍니다.


2012/09/18 - [About Kinect] - [Kinect Study] Installation of Kinect SDK


그리고 거기에도 설명을 해놨지만 기본적으로 Kinect SDK를 활용해서 개발하기 위해서는 최소 Windows 7 이상에 Visual Studio 2010 이상의 개발 환경을 구축해야 합니다. 물론 제가 이전 포스트에서도 보여드렸다시피 Windows 8 / Visual studio 2012에서도 개발이 가능합니다. 


자 이제 본격적인 개발에 대한 정보를 알아야 하는데 여기서 간단한 예제를 소개해드립니다. 바로 Kinect Explorer 입니다.



이 예제는 Kinect SDK v1.0부터 꾸준히 내려오는 예제로 키넥트로 할 수 있는 건 뭐든지 다 테스트 해볼 수 있는 만능 툴입니다. 심지어는 Tilt motor의 각도도 조절할 수 있습니다. 아 딱하나 음성인식은 포함안되어 있네요. 아무튼 여기서는 해상도에 따른 Color와 DepthImage의 차이를 보여주고 거기서 사람에 대한 골격도 보여줍니다. 그리고 왼쪽 상단에 있는 건 키넥트가 현재 어떤 상태다 라는 걸 나타내는 Console입니다. 만약 키넥트가 두대 연결되면 여기서 두대가 인식되게 됩니다. 지난번 제가 한 테스트에서도 보셨겠지만 한번에 두개의 Kinect Explorer가 활성화됩니다. 대신 거기에도 언급했다시피 Skeleton은 한 대의 키넥트로만 잡을 수 있습니다.



자 가장 기본적인 kinect API의 사용방법입니다. 보통은 키넥트가 연결되어 있는지에 대한 조건문을 삽입하고 연결되어 있을 경우에 자신이 사용하고 싶은 기능에 대해서 Enable하는 경향을 띕니다. 그게 다 설정되었으면 그 기능을 가지고 키넥트가 start을 하게 되는거지요. 이런 과정에서 등장하는 개념이 바로 c#의 event라는 개념인데 그냥 특정 조건이 만족되었을 때 활성화 되는 겁니다. 키넥트와 직접적으로 관련된 이벤트는 크게 4가지, Color,Depth,Skeleton 그리고 4가지를 동시에 활용할 수 있는 AllFramesReady 이벤트가 있습니다. 그럼 뭐하러 하나하나씩 나눠났냐라고 궁금해 하실 수도 있는데 그냥 키넥트에 걸리는 부하를 조절하는 차원이라고 보시면 좋을거 같네요. 음성은 이런 이벤트가 아니라 다른 방식으로 처리됩니다. 


이런 것들을 활용할 수 있는 자료중에 가장 유용한 툴이 바로 앞에서도 간단하게 언급한 Coding4FunToolkit입니다. 이건 제가 맨처음 키넥트 관련 포스트를 했을 때도 나왔던 내용이고 WPF상으로 이미지나 뎁스를 쉽게 뽑을 수 있는 Tool을 미리 만들어놔서 그냥 DesignView상에 드래그 앤 드롭 형식으로 프로그램을 만들게 도와주는 도구입니다. 그밖에도 skeleton에 scaleTo라는 속성을 추가시켜서 손쉽게 사람의 골격을 확장시킬 수 있습니다.


왼쪽에 있는 것이 바로 초창기의 Kinect Developer ToolKit이었고 이때는 예제가 딱 5개 있었습니다. 그런데 이제는 21개의 예제가 들어있기 때문에 다양한 범위로 확장시킬 수 있게 되었습니다. 추가적으로 DirectX나 XNA를 활용한 프로젝트도 있기 때문에 게임쪽으로도 샘플이 생겼다는데 의미가 있습니다.


이제 다룰 내용은 바로 RGB를 활용한 키넥트의 기능입니다. 참고로 가운데 있는데 키넥트의 RGB Cam인데 아무래도 RGB와 Depth가 다른데서 서로 나오기 때문에 서로 픽셀이 불일치하는 경우가 발생합니다. 이때는 Calibration이 필요하고 거기에 맞는 함수가 따로 존재합니다. 나중에 따로 이에 관해서 정리해보도록 하겠습니다.



앞에서 잠깐 소개해드린 것처럼 RGB를 사용하기 위해서는 ColorFrameReady라는 이벤트를 사용해야 합니다. 이때 꼭 필요한 정보가 바로 픽셀의 PixelDataLength이고 바이트형 배열에 저장됩니다. 우리가 이미지를 2차원으로 볼수 있는 것과 달리, 컴퓨터는 이런 이미지를 1차원적으로 배열해서 저장합니다. 그럼 이미지로 띄우기 위해서는 루프를 만들어서 위에서 아래로 쓱 긁어주는 형식을 취하게 됩니다. 그럼 이 값을 위해서는 당연히 이미지의 Height과 Width 정보도 알고 있어야겠지요. 그리고 v1.0때는 FrameNumber라고 해서 키넥트가 0초일때부터 해당시간까지 나온 Frame의 숫자를 나열해주는 것이 있었습니다. 그래서 보통 여기에 TimeStamp를 나눠서 FPS를 구할 수 있었습니다. 하지만 v1.5 부터 이 개념이 바뀌어서 그냥 Frame사이사이를 구분해주는 독특한 수가 되었습니다. 


위처럼 Color는 두가지 해상도를 제공하고 그중하나는 YUV라는 RGB에서 조금 진보된 색상계를 사용합니다. 보통은 색이 주변 빛의 영향을 많이 받는 이 YUV 규격은 외부 조명에 대해서 조금 강하게 느낍니다. 그래서 구분을 잘 할 수 있는거지요. 하지만 그 색과 외적인 부분을 처리하는데 있어서 부하가 발생하는 건 어쩔 수 없지요. 상대적으로 FPS도 낮아지게 됩니다.

아래의 이미지들이 각각 해상도에 따른 출력입니다. 한번 보시고 적절하게 사용하시면 좋을 거 같습니다.




RGB 640x480 FPS30,                                          RGB 1280x960 FPS12,                                          YUV 640x480 FPS15  

<사진을 누르시면 크게 보입니다.>


                

                        640x480 FPS 30                                                                        320x240 FPS 30                                                    80x60 FPS 30

<사진을 누르시면 크게 보입니다.>


그리고 마지막 하나가 바로 Near Mode인데 차이를 한번 보세요. 왼쪽이 안한겁니다.



흰색인 부분은 인식이 안된 부분이고 보면 오른쪽에서는 기존에 인식안됬던 부분도 인식이 되고 있습니다. 참고로 일반 모드에서 기본으로 제공하는 최소 범위는 80cm이상이고 Near Mode 사용시에는 40cm입니다. 


여기까지가 오늘 다룬 내용이었고 아마 다음 시간에는 간단하게 코드를 분석하는 걸 다뤄보고자 합니다. 



댓글