티스토리 뷰

OpenCV

[Kinect with OpenCV] CAMShift 적용 (2) Color Segmentation

생각많은 소심남 2012. 9. 25. 01:59

문제가 발생했습니다. 

사실 color에 기반한 CAMShift를 사용하면 hue값만 가지고 손의 위치를 잡을 수 있기 때문에 쉽게 구할 수 있습니다.

하지만 제가 적용하려고 하는 것은 Depth니까 기본적으로 1 channel일테고, 그러면 거기서 Hue 값을 뽑아내도 hexacon의 특성상 다른 특성들도 구분하지 못하게 됩니다. 또한 히스토그램을 뽑아낸 과정에서 배경인 검정색의 영향이 엄청 크게 작용합니다. 결론적으로 Color 기반의 CAMShift를 그대로 적용하기 힘들다는 것이지요. 그래서 그와중에 생각한 방법중 하나가 Depth에 Color를 segmentation을 해보는게 어떨까였습니다. 그래서 color 손에 대해 Camshift를 수행한 후 해당 Rectangle을 Depth에만 넘겨주면 된다고 생각한 것이죠. 제가 참고한 논문은 다음과 같습니다.


Interaction System of Treadmill Games based on depth maps and CAM-Shift  Hu Hai 



여기에 따르면 Depth에서 Background를 제거한 후에 Binary로 바꾼후 Color와 Matching 시키는 과정에 대해서 언급했습니다. 사실 몇가지 과정을 빼면 제가 가는 방향과 비슷한거 같아서 한번 적용해봤습니다.


사실 당연한 이야기겠지만 IR Emitter와 RGB CAM은 같은 위치에서 방사되는 것이 아니기 때문에 당연히 MisMatch가 발생합니다. 보통 stereo Cam에서는 disparity와 Color를 보정하는 Calibration을 체스판을 가지고 하지요. 그런데 사실 Kinect SDK에서도 Calibration할 수 있는 function을 제공합니다. 바로 NuiImageGetColorPixelCoordinatesFromDepthPixel()입니다.




서두에도 언급되어 있는 것처럼 DepthPixel과 matching 되는 ColorPixel의 위치를 구해주는 것이 이함수의 역할입니다. 보통 이걸 쓰는 이유는 3D Point Cloud를 visualization하기 위해 Color와 Depth를 일치시켜주는 과정중에 하나로 사용됩니다. 저는 그냥 일련의 과정으로 사용한 것이니까 그냥 참고하시면 좋겠습니다. 다음은 동작동영상입니다.



그래도 CAMshift 잘 안되네요.. 아..    

댓글