티스토리 뷰

Kinect

[kinect 프로젝트] Camera Fundamental

생각많은 소심남 2012. 2. 3. 13:12

지난 시간에는 개발 환경을 설정하는 것부터 했으니 이번에는 그 프로젝트를 토대로 ColorViewer와 Tilt Option을 건드리는 것을 해보겠습니다.

우선은 그때의 프로젝트가 조금 불안정한 것이 있어서 새 프로젝트를 첨부합니다.


새 프로젝트의 압축을 풀고 시작해보겠습니다.

들어가기에 앞서서 키넥트의 Color Resolution에 대해 확인해보면 총 3가지 스펙을 제공하고 있습니다.

 
이 화면은 Kinect Explorer Sample을 열었을 때 나오는 설정창인 위처럼 제공됩니다. 예전에는 640*480 모드만 지원한다고 되어있었는데 지금 이게 엑박용 키넥트에서도 이 스펙대로 제공하는지 궁금하네요. 아무튼 각 모드를 선택하면 그에 따라서 Fps도 바뀝니다.
 



Depth Resolution도 아래와 같이 3가지 모드를 지원합니다.

 
혹여나 밑에 있는 Range 버튼이 있어서 SDK 자체적으로 인식 범위를 줄일 수 있겠다 하시는 분도 있겠습니다만.
엑박용 키넥트에서는 Range 조절기능이 비활성화됩니다. 아마 윈도용 키넥트에서는 인식범위가 최소 40cm라고 하니까 여기서 조절이 되는게 아닐까 싶습니다.  

이제 본격적으로 시작해보겠습니다.  
아까 압축파일을 풀면 지난 포스팅에서 한 것과 똑같은 창이 뜹니다. 그중에서 xaml창으로 들어가 Width를 800으로 늘입니다.


 이제 MainWindow에 Image를 삽입합니다. Image는 툴박스안에 있고 이것을 그냥 드래그해서 넣으면 됩니다.

 
그 다음 Properties에서 Width Height 항목을 찾아서 각각 320 240으로 바꿔줍니다. 

이제 할 것은 코드를 수정하는 겁니다. MainWindow안의 아무거나 잡고 마우스 우클릭하면 View Code라고 있습니다. 아니면 숨김 파일로 해서 코드로 들어와도 되고요. 우리가 수정해야 할 부분은 바로 지난 시간에 못채웠던 AllFrameReady 부분을 채워야 합니다.


일단 컬러프레임이 안들오면 동작을 넘겨야 합니다. 
그리고 컬러프레임의 출력에서 나오는 데이터를 넣는 공간은 위에 보이는 것처럼 byte 배열형으로 되어있어야 합니다.
그 크기는 일일이 계산을 해서 넣을게 아니라 그냥 컬러프레임의 크기를 집어넣으면 동적으로 형성되겠지요.

그 밑에 있는 CopyPixelDataTo()는 픽셀로부터 받은 데이터를 컬러프레임으로 복사하는 역할을 합니다.

여기서부터는 이제 이미지처리에 대한 이해가 필요할 거 같네요. 동영상에서도 이부분에 대해서 이야기를 하고 있지만
여기서 언급하는 bgr32 규격(blue, green, red, empty)을 맞추기 위해서는 컬러 프레임의 폭을 4배로 늘리는게 필요하답니다. 내장되어 있는 칩이 (0,0) 픽셀에서부터 읽을때 각 색상을 순차적으로 읽기때문에 그렇다네요.
그래서 여기서는 stride 라고 표현했지만 실제상으로 BitmapPixel이라는 걸 알아두셨으면 합니다.

이제 아까 xaml상에서 만들 Image의 소스를 만들어야 합니다. 그에 필요한 정보는 픽셀의 폭과 너비, x축 dpi와 y축 dpi, 픽셀의 포멧형 ( 물론 bgr32 규격을 쓴다고 했습니다.)  등등이 필요합니다.


이제 위에 대한 정보를 넣었으면 이제 f5로 실행시켜봅니다.


한 10초가 있으면 이렇게 컬러 이미지로 뽑을 수 있는 것을 확인할 수 있습니다. ( 문제는 이렇게 하고 난후 키넥트가 멈추지 않습니다. 일단 지금은 Windows_closing안에 있는 StopKinect() 이벤트가 발생하지 않는 것 같네요. 이부분도 확인해보겠습니다..)

아무튼 이렇게 이미지를 뽑아내는데는 성공했습니다.
위와 같은 방법을 통해서 이미지를 얻어오는데 있어서 장점은 이미지를 다시 사용할 수 있다는 겁니다. 그래서 재처리하는데 용이하다는 거지요.
그런데 동영상에서는 더 쉬운 방법을 소개합니다. 지금까지 한 부분을 주석처리하고 KinectSensorChanged안의 AllFrameReady관련 구문도 주석처리합니다.
그리고 xaml상에서 툴박스 내에 KinectColorViewer를 찾아 MainWindow상에 집어넣습니다. 물론 기존 코드로 처리한 것과 비교하려면 이번엔 오른쪽에 배치하는게 낫겠지요.


역시 크기조절은 아까 했던 방법과 동일합니다.
그 후 Properties상에 Kinect라고 검색하면 하나가 나옵니다. 이걸 누르면 여러가지 항목이 나오는데 Data Binding을 선택해줍니다.


이걸 선택하면 복잡한 창이 뜹니다. 첫번째 선택해야 할 항목은 Source입니다. 여기서 주의해야 할건 우리가 키넥트와 관련된 데이터를 받아와야 할 소스를 선택해야 하는데 ColorView가 아니라 기존 프로젝트에서 삽입했던 Chooser입니다. 물론 이전 프로젝트에서 이 Chooser가 정상적으로 동작하지는않지만 아무튼 이 부분을 선택해줍니다.


그 후 밑의 Path로 넘어가서 Kinect만 고릅니다. 이로써 kinect에서 사용하는 기능을 모두 쓸 수 있습니다.


이제 Kinect를 더블클릭하면 아무변화가 없는 것 같은데 뒤에 보면


와 같이 바인딩이 생겼습니다. 이제 실행해보면


클릭만으로도 이미지를 뽑아올 수 있다는 것을 확인할 수 있었네요. 어 그런데 이렇게 하니까 키넥트가 정상적으로 꺼지네요.. 참 이상합니다....

다음 소개할 내용은 카메라의 틸트 기능입니다. 그런데
동영상에도 언급되어 있다시피 이 항목은 


ElevationAngle에 값을 대입하는 것만으로도 카메라의 위치를 바꿀 수 있습니다. 예제에 대한 샘플은 그냥 카메라가 움직이는 것만 확인할 수 있기에 Kinect Explorer로 찍은 영상으로 보여드리겠습니다.


간단한 Camera 기능 이용이었습니다!
 

댓글