티스토리 뷰

OpenCV

[Kinect with OpenCV] Extended Depth Data 이용하기

생각많은 소심남 2012. 10. 18. 18:39

지나간 포스트 중에 Depth Map을 뿌려보는 예제를 소개한 적이 있습니다.

2012/10/01 - [About OpenCV] - [Kinect with OpenCV] C로 만들어보는 뎁스 이미지 호출


그런데 제 글을 읽어보신 분은 아시겠지만 Kinect SDK가 v1.6으로 올라가면서 Depth의 Range가 4m 이상으로 확장되었습니다. 이 기능은 사실 OpenNI에서는 구현이 되어 있던 기능이었는데 Kinect SDK v1.5에서는 Depth Range가 4095mm 로 한정되어 있었습니다. 이 값은 그 내용에 대해서 포스팅할 때도 그냥 넘어갔던 값입니다.



여기보시면 I값을 표현할 때 끝에 0x0fff로 나눠주시는게 보이실겁니다. 이걸 10진수로 표현하면 4095가 되는거지요. 사실 저렇게 구현한 의도는 4095mm가 최대 인식 거리이므로 거기에 대해서 grayscale로 매핑을 하기 위한 수식이었던 거지요. 하지만 이제 저런게 필요 없어진다는 거지요. 


그런데 여기서 잠깐 알아둘게 있습니다. 사실  몇번 나왔던 내용이지만 depth data는 16bit stream에 담겨서 전달됩니다. 그중 하위 3bit은 PlayerIndex라고 해서 키넥트가 인식하는 사람의 숫자를 판단하는 기준이 됩니다. 이 값의 영향으로 DepthRange는 상위 13bit으로 표현할 수 있는 값인 2^12 - 4096 이 되는거지요. 

그래서 실제로 지난번 소개해드린 예제로 이미지를 뽑아보면 다음과 같습니다.



여기서 검정색인 정보가 그 4096 이상으로 처리된 Data지요. 그래서 이번에 새로 등장한 걸 적용해보고자 합니다. 고칠 부분은 딱 하나입니다. 지난 포스트에서 트릭으로 알려드렸던 Near mode 활성화 부분을 다음과 같이 처리해주면 됩니다.




바로 DEPTH_VAULE를 확장시켜주는 플래그를 하나 더 다는 겁니다.

이유는 PlayerIndex를 처리하는 bit이 다른데로 이전되었기 때문입니다. 그래서 훨씬더 넓게 쓸 수 있는 플래그를 하나 더 달고 OR 연산을 취한 겁니다. 위와 같이 하면 Near Mode도 되면서 Extended Range를 가지게 되는 것이지요. 결과는 이렇게 바뀝니다.



좀더 확실한 증거를 위해서 동영상도 보여드립니다. 이게 제가 근무하는 곳입니다.


이렇게 쉬운 방법으로 DepthData를 더 확장성 넓게 구현할 수 있습니다. 간단한 팁 소개였습니다.

댓글