티스토리 뷰

OpenCV

[Kinect with OpenCV] CAMShift 적용 (1)

생각많은 소심남 2012. 9. 19. 00:32

이제 손을 분리했으니까 손에 대한 추적을 해야됩니다.

그런데 보통 추적이라면 어떤 생각을 하시나요? 무작정 따라다니는거?



사실 추적이라는 정의의 조건에는 단순히 따라다는 것에만 그치는 것이 아니라 기존의 타겟을 놓치지않고 잡는다는 것이 포함됩니다. 즉 감시용 CCTV에서도 움직이는 사물에 대해서 추적을 한다는 것은 단순히 탐지만 하는 것이 아니라 끝까지 궤적을 알고 있어야 하는 거지요. 

하지만 제가 작성하고 있는 프로그램에는 아직 그런 추적이라는 개념이 적용되지 않았습니다. 그래서 오른손이 나와있다가 왼손이 나오면 왼손이 잡히는 오동작이 발생합니다. 물론 이를 해결하기 위한 방법들이 여러가지가 나오는데 영상처리분야에서 타겟 추적에 가장 많이 쓰이는 기법이 바로 Mean Shift와 CAM shift입니다. Mean shift는 말 그대로 물체의 위치를 기준삼아서 그점이 이동하는 점을 계속해서 따라다닙니다. 그런데 단순히 위치값만으로는 추적하기 힘드니까 추가적으로 가미하는 정보가 바로 색상정보입니다. 그 색상을 분석하고 그 색상을 가지고 있는 사물을 계속 추적하게 되는 것이죠. CAM shift는  여기서 사물의 멀고 가까워짐에 따라서 추적도 가능한 Meanshift의 개선된 형태입니다. (사실 전 처음에 CAM shift가 CAM을 이동시켜서 추적하는 방식이라고 알고 있었는데 정확히 말하면 Continuously Adaptive Mean Shift Algorithm의 약자입니다. 즉 캠과는 전혀 상관이 없습니다.)

 하지만 이 기법은 한계가 존재합니다. 색상 값은 여러분들도 알다시피 태양에 반사된 파장에 따라서 사람의 눈에 다르게 보입니다. 즉 빛의 밝기, 비춰진 방향에 따라서 같은 사물이 다른 정보를 나타내게 됩니다. 이런 와중에 색정보를 활용해서 추적을 하면 잘 못잡을 가능성이 커집니다. 물론 CAMshift라는 알고리즘 자체가 조금더 보완되고, 기존의 한계가 YCbCr이라는 빛의 밝기에 조금더 robust한 색상계를 사용하면 개선이 될 수 있지만 완벽한 답이라고는 할 수 없지요. 그래서 이에 대한 연구가 많이 진행중입니다. 

 사실 인터넷에 CAM shift 예제가 공개되어 있어서 저도 시도를 한번 해봤습니다.




보시다시피 색상값을 인지하고 계속 추적하는 기법이 바로 CAMshift 방식입니다. 

 자 그럼 제가 프로젝트에서 활용하는 Depth기반의 handTracking도 가능할까요? 제가 지금 그걸 시도해보고 있습니다. 

우선은 기존의 방식이 색상계에 대한 Histogram을 뽑아내고 그 것을 기반으로 계속 따라다니는 구조를 취합니다. 하지만 저는 Depth라는 Grayscale이라는 정보를 가지기 때문에 이를 토대로 histogram을 뽑아내야 합니다. 그래서 그 결과가 다음과 같이 나옵니다.



위에 하늘 색으로 표시된 부분이 손 부위의 히스토그램입니다. 다음은 동작 영상입니다.




손에 대해서 일정한 크기의 관심영역을 설정하고 그 영역내에 있는 픽셀들의 히스토그램을 뽑으면 위와 같습니다. 이제 이를 기반으로 CAMshift에 사용하면 조금더 발전이 될듯합니다. 

어느 것이 장점이 있다 말을 못하겠지만 남들이 안 해본 분야라서 도전해보려고 합니다. 잘되겠지요?

댓글