티스토리 뷰

OpenCV

[Kinect with openCV] ConvexHull

생각많은 소심남 2012. 9. 15. 00:13



지난번까지 손의 궤적을 추적해서 매트랩으로 도식화하는데까지 보여드렸습니다. 그런데 사실 문제가 조금 있습니다. 

사실 제가 구한 중심점은 실제 중심점이 아니라 ROI를 토대로 만든 가상의 중심점입니다. 그래서 사실 손의 중심이 아니라 팔의 중심이라고 하는게 맞겠지요. 그래서 다른 Tracking 기법을 적용하기가 참 힘듭니다. 그만큼 참조해야할 범위가 넓고 만약 다른손이 중간에 끼어들면 ROI는 다른게 잡혀버리기 때문이지요. 결론적으로는 손이라는 범위를 팔에서 축소시킬 필요가 있습니다. 

 물론 그 방법에는 다양한 방법이 있고 이와 관련된 논문이 많이 나와있습니다만 가장 많이 사용하고 보편적으로 사용하는게 바로 ConvexHull이 아닐까 생각합니다. 사실 제가 연구실에서 세운 목표는 키넥트의 DepthMap을 활용해서 손가락을 인식하는 것이었고, 이를 위해서 여러가지 방법이 있었습니다. 우선 지금까지 소개했던건 그냥 단순하게 손을 추적하는 범주에 한정되어 있지만 이걸 적용하면 손가락도 가능하겠지요. 물론 각 손가락의 pixel position만 알수 있다면 지난번에 소개해드린 NuiTransformDepthImageToSkeleton() 함수를 사용하면 손끝에 대한 3차원 포인트도 구할 수 있을겁니다. 우선 저는 오늘 팔에서 손을 자를 것을 도전해봤습니다. 


간단하게 말하자면 ConvexHull이란 밀집되어있는 점군에서 가장 최외곽에 있는 점들중 꺽이는 정도가 큰 점들의 집합을 말하는 것이고 OpenCV에서 말하는 ConvexHull은 그 점들을 다 연결시켜주는 알고리즘을 말합니다. 물론 이렇게 말하면 Contour랑 구분이 안될 수도 있지만 contour는 개체를 구성하는 점들을 모두 모아놓은 것이고 ConvexHull은 그 중에서도 기울기가 급격히 변하는 점들을 연결해서 보여줍니다. 그래서 이를 통해서 사물의 모양을 유추할 수 있습니다. 

 보통 손을 탐지할 때는 Contour를 구해서 그 위에 다시 convexHull을 씌우는 형식이 됩니다. 그러면 다음과 같이 나오겠지요.



이중 빨간색으로 표시되는 부분은 Defect라고 해서 한마디로 결합입니다. 선으로 이은 가운데에 거리가 먼 점이 바로 Defect Point가 되는 것이죠. 바로 여기서 손을 자르는 생각을 할 수 있습니다. 이 Defect를 구하는 함수가 cvConvexityDefect()라는 함수인데 이 값에는 각 defect에 대한 위치가 나옵니다. 여기서 시작점과 끝점만 구해서 그 부분만 ROI를 잡으면 어떻게 될까요? 그러면



이렇게 까지 나올 수 있지 않을까 하는게 저의 추측입니다. ConvexHull에 대한 결과물입니다. 



댓글