티스토리 뷰

Processing

[Kinect with processing] Depth Data로의 접근

생각많은 소심남 2012. 10. 20. 11:32

좀 지난 시간에 제가 SimpleOpenNI 라이브러리를 이용해서 Processing에서 Depth Map을 출력하는 방법을 소개한 적이 있습니다.

2012/07/04 - [About Processing] - [Processing] DepthMap In SimpleOpenNI


사실 이 포스트에서는 아주 기본적인 DepthMap 출력 형태를 소개해드렸기 때문에 사용자가 자신이 원하는 대로 DIY를 할 수 있던게 제가 포스트를 한 의도였습니다. 많은 분들도 그에 따라서 수정을 해보셨겠지요. 오늘 한분이 궁금해 하신 내용 중 하나가 이것이었습니다.

 과연 Kinect로부터 DepthMap은 받아오는데 다시 사용자가 DepthMap을 기반으로 Processing에서 그 무언가를 뿌리는게 가능하지 말입니다.

생각보다 Processing의 기능이 강력해서 자신이 상상하고 있는 것들 거의다 구현이 가능할 겁니다. 문제는 그걸 어떻게 구현하느냐에 대한 차이겠지요. 


우선 기본 Depth Map 예제에서 출발하겠습니다. 우리가 이 정보를 바탕으로 다시 Processing 스케치 상에 그리기 위해서는 무엇보다도 픽셀에 대한 접근이 필요합니다. 그래서 그 때도 이런 알고리즘을 하나 소개해드렸을 겁니다.



어차피 DepthMap 자체가 하나의 배열 값이기 때문에 따로 DepthValue라는 배열을 생성하고 그안에 저장하도록 했습니다. 그럼 depthMap의 크기만큼 depthValue가 생성될 겁니다. 그러면 위와 같이 루프 구문을 돌려서 하나하나 픽셀을 검색하다보면 자신이 찾고 싶은 정보를 가진 픽셀을 찾을 수 있는 것이겠지요.



이렇게 한 줄을 추가한다면 매 픽셀별로 가진 depthValue가 millimeters라는 정수형 타입에 저장될 겁니다. 하지만 이는 임시적인 값일 뿐 조건문이 돌다보면 이 값이 계속 바뀌겠지요. 그래서 이값을 이용하기 위해서 무언가를 그려주는 함수가 바로 이 millimeters가 정의된 부분 바로 밑에 형성되어야 합니다.


자 무언가를 그린다고 하는 건 픽셀로의 접근이 필요합니다. processing에서는 스케치 화면상에서 뿌려주는 모든 픽셀에 대한 정보값을 가지고 있지만 사용자가 이를 조작하기 위해서는 다음과 같은 과정이 필요합니다.



바로 픽셀 정보를 load해주는 과정과 수정한 값을 업데이트 해주는 과정입니다. 함수로는 loadPixels()와 updatePixels()입니다. 즉 픽셀에 대한 정보가 이 프로세싱상에서 이용되려면 결론적으로 그걸 어디에선가 불러와야 하는 거지요. 그런데 재미있게도 이건 그냥 접근할 수 있게끔 도와준다는 거지 실제로 위처럼 픽셀단위로 움직이면서 수정하려면 pixels[i] 같은 식으로 또 접근해야 합니다. 

 유의 해야 될 것은 이 같은 과정이 루프안에 있으면 안된다는 겁니다. 어차피 픽셀에 대한 정보는 한 프레임을 읽어올 때 다 읽어오는 것이기 때문에 픽셀을 탐색할때마다 매번 loadPixel을 해줄 필요는 없는거지요. updatePixel도 마찬가지 이유에서 루프 밖에서 처리됩니다. 


자 이제 pixel에 대한 정보와 millimeter에 대한 정보를 구했으니까 이를 토대로 특정 depth 영역에 색을 입히는 과정을 해보겠습니다. 그냥 이부분은 조건문만 잘 짜주면 되겠지요.



예시로 1m와 2m 사이의 depthValue를 가진 모든 픽셀의 색상을 위처럼 입히게 했습니다. 물론 i가 증가하면서 해당 픽셀은 c라고 정의된 색상으로 입혀지겠지요.

그런뒤에서 한 프레임상의 픽셀 탐색이 끝난 후에는 updatePixels()를 통해서 갱신되는 형식입니다.



짠! 특정 범위내에서는 위처럼 색상이 입혀지게 됩니다. 물론 동영상으로 보시면 더 이해가 잘 되실 겁니다.



아마 감각이 있으신 분이라면 조금더 멋지게 바꾸실 수 있겠지요. 참고로 저는 random()을 이용해서 이렇게까지 잠깐 해봤습니다.



무언가 TV의 잡음이 낀 형태네요. 아무튼 여기까지였습니다.        

댓글