티스토리 뷰

OpenCV

[Kinect with OpenCV] Color / Depth Alignment

생각많은 소심남 2012. 12. 12. 15:19

이전에 이런 글을 쓴 적이 있습니다.

2012/09/25 - [About OpenCV] - [Kinect with OpenCV] CAMShift 적용 (2) Color Segmentation

사실 온라인상에 공개되어 있는 CAMShift를 수행하기 위해서는 Color 기반의 histogram이 나와야 됩니다. 그래야 사물에 대한 추적을 할 수 있는 것이지요. 하지만 그 글에서도 언급된 것처럼 다음과 같은 이미지가 나오게 됩니다.



이유는 키넥트의 카메라 배치때문입니다.


딱 보면 아시겠지만 Color를 볼수 있는 RGB Cam과 Depth를 볼 수 있는 Depth Cam의 위치가 다릅니다. 즉, 시점이 다르다는 것이지요. 

여러대의 웹캠을 활용한 프로젝트에서도 시점이 맞지 않기 때문에 이를 보정해주는 과정을 거치는데 이를 Camera Calibration이라고 합니다. 보통 이 과정을 체스판을 이용해서 많이 진행합니다. 

 그래서 키넥트도 일종의 Calibration 과정이 필요합니다. OpenNI의 샘플에서 이 calibration을 수행하면 다음과 같이 나옵니다.



OpenNI에서 Calibration을 하면 위와 같이 정확히 매칭이 되지는 않지만 그래도 나름대로의 결과물을 얻을 수 있고,이 샘플은 NIViewer를 열어보시면 관련 코드가 구현되어 있습니다.

Kinect SDK에서도 reference를 잘 보면 아시겠지만 이 매칭을 해주는 함수가 있는데 그게 NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution()입니다.


인자값으로 Color의 해상도와 Depth의 해상도 그리고 depth 픽셀의 x,y점만 넣어주면 변환된 좌표값으로 plColorX, plColorY가 나오게 됩니다. 그 결과는 다음과 같이 나옵니다.



지금 위의 결과는 PlayerIndex 값이 있을 경우에만 출력하게 한 결과이며, 몇번 말씀드린 내용이지만 depthStream 내에 depthValue와 playerIndex 값이 들어 있기 때문에 사람만 잡을 수 있는 거지요. 동작 영상은 다음과 같습니다.


현재 Near mode를 켜 놓은 상태였는데 40cm 근방의 거리에서도 손끝까지 어느정도 매칭이 된 것을 확인할 수 있습니다.

코드가 궁금하신 분은 해당 링크를 참고하시면 도움이 되실 듯 합니다.

http://www.rozengain.com/blog/2012/08/01/using-opencv-2-with-kinect-sdk-1-5/

댓글