티스토리 뷰

Processing

[Processing] ClosestPoint 추출

생각많은 소심남 2012. 7. 16. 00:50

Processing의 Kinect 라이브러리인 SimpleOpenNI를 사용하면 정말로 간단하면서 다양한 키넥트 어플리케이션을 구현할 수 있습니다. 이와 관련된 책들도 현재 많이 나오고 있습니다. 거기서 제일 처음 나오는 프로젝트들 중 하나가 바로 가장 근접점을 뽑아내는 것입니다. 이를 통해서 메모리로부터 어떤 픽셀이 가까운지를 감지할 수 있는 중요한 예제이기 때문이지요. 잠깐 요약을 하자면 픽셀의 데이터는 1차원적으로 쭉 늘어진 배열에서 뽑아오는 것이기 때문에 그 중 하나를 뽑으려면 그것에 관한 정의를 잘 내려야 한다고 했었지요. 이번에도 관련 예제를 다뤄보겠습니다. 

우선 라이브러리 삽입 및 자료형 정의가 전제되어야 하겠습니다.그리고 사전에 setup에 들어갈 부분은 항상 맨먼저 언급되었던 내용이니까 그대로 적습니다. 이번 예제에서는 DepthData만 사용할 것이기 때문에 Depth 기능만 enable시킵니다.



위코드에서 depthValue는 키넥트에서 점간의 거리를 표현해주는 것이고, depthX와 depthY는 해당 포인트의 X,Y 점을 각각 표현한 겁니다. 어차피 1차원 배열속 픽셀을을 읽어오려면 for 구문을 삽입해서 매 프레임마다 해당 픽셀을 읽는 방식 채택해야 합니다. 

이제 채울 것은 매 프레임마다 그려줄 무언가를 정의하는 draw를 채워야 합니다. 지난 포스트에서는 딱 여기까지 했었지요.



여기까지 하면 DepthImage가 화면으로 출력됩니다. 이번 포스트인 근접점 예제는 여기서부터 시작합니다. mousePressed 함수안에 들어있던 픽셀 읽어오는 코드를 여기에도 똑같이 응용해보겠습니다.



위와 같이 구현하면 draw 함수는 매 프레임시마다 호출되는 함수이므로 그때마다 해당 픽셀의 DepthValue를 읽어오는 루프 구문이 형성됩니다. 그러면 currentDepthValue에는 각 픽셀의 DepthData가 들어가겠구요. 

 여기다가 가장 근접점을 감지해서 각각 closestX와 closestY로 정의하면 그게 바로 closestPoint가 될겁니다.


위와 같이 구성을 하면 closestValue가 currentDepthValue로 갱신되면 계속 작아지는 값으로 입력될 겁니다. 그 과정이 반복되다가 키넥트가 인식할 수 있는 거리까지 도달하면 그 포인트가 closestValue가 될겁니다. 그리고 그때의 x,y를 각각 정의시키고 그 위치를 가리키게 하면 시각적으로 표현되는 근접점이 되겠습니다. 

 아참 그리고 지금은 closestValue의 값이 정의되어있지 않으므로 이상태로 돌리면 분명 결과는 나오지만 쓸데없는 과정으로 인해서 시간이 지체됩니다. 그래서 사전에 값을 정의하는 것이 좋습니다. 우선 키넥트가 인지할 수 있는 최대 거리는(MS 드라이버 기준) 4m 정도이므로 조건문 앞에서 closestValue를 다음과 같이 정의합니다.


자 이걸로써 이제 ClosestPoint에 대한 정보를 얻어냈습니다. 이제 그 점을 어떤 개체로 나타내주면 되겠지요. Ellipse로 표현을 해봅니다.


다됬습니다. 한번 결과를 보겠습니다.



가장 가까운 포인트를 초록색 원이 가리키는 것을 확인할 수 있습니다. 잠깐 아까의 조건문을 다시좀 볼까요?



여기서 왜 CurrentDepthValue가 0보다 큰 조건을 삽입했는지 아시겠는지요?

지금 위의 결과 영상에서도 확인할 수 있지만 인식이 안되는 점은 검정색, 즉 0으로 표시됩니다. 만약 위 조건이 들어가 있지 않는다면 원은 검정색 부분을 가리킬겁니다. 그리고 그런 부분이 많기 때문에 값이 중구난방으로 마구 튈겁니다. 

 아무튼 가장 가까운 점을 뽑는 것도 그렇게 어렵지는 않습니다. 저도 Kinect SDK 상에서 가장 가까운 포인트를 구하는 포스트를 소개해드렸었는데 오히려 프로세싱으로 접근하면 조금더 간단하다고 느껴지네요.

댓글