오랫만에 새글을 작성하는거 같다.

 

춘계 멀티미디어 학회 준비도 그렇고 연구실 프로젝트도 그렇고 이런저런 일이 겹쳐서 너무 정신없었던 나머지 업데이트도 하지 못했다.

 

어째뜬, 오늘 글을 끄적이는 주제는 RGB 이미지와 Depth 이미지의 Calibration 인데, 관련 자료를 찾아보는데, 너무나도 많은 시간을 허비한거 같다.

 

외국사이트에서는 OpenNI를 이용하여 RGB 와 Depth 카메라 각각에 접근, 체스보드판을 촬영하여 정확한 Calibration 값을 추출하여 Point Cloud를 구성 하는것을 많이 봤지만, SDK를 활용해서 만든 자료는 거의 없었다.

 

하지만 이번에 SDK 버전이 1.0으로 업뎃이 되면서 이런저런 좋은 함수가 지원이 되는데, 그중에 쓸만한것 2개정도만 간추려서 소개를 해볼까 한다.

 

각 함수의 매개변수는 구글에 복사해서 엔터키 땅 때리면 쫘르륵~~ 나오니깐 검색해보시길..

 

(솔직히 귀찮은것도..?? 하하..ㅋㅋㅋㅋ)

 

첫째. NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution()

 

아래 사진은 그 결과물이다.

 

하지만 결과물은.. 썩 맘에 들지 않는다. 왜냐하면 Depth 이미지가 오른쪽으로 2~3픽셀씩 시프팅 된거 같은데, 수동으로 반대로 이동 시키면 나머지 부분이 좀 매칭이 안되는 경향이 있다.

 

그래서... 패스!!

 

관련 함수 사용한 홈페이지의 레퍼런스 : http://kassymemo.blogspot.com/2012/04/kinect-for-windows-sdk3.html

 

 

두번째. NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution()

 

이함수는 결과물을 보면 알수있겠지만 어느정도 매칭이 되는것을 확인 할수가 있다.

 

너무나도 맘에 든다.

 

좀 울렁 거리는게 있지만, 저건 뭐 Image Processing 작업을 통해 해결 할수 있을거라 생각하고..

 

관련 함수 레퍼런스 링크 : http://stackoverflow.com/questions/10117396/trouble-fitting-depth-image-to-rgb-image-using-kinect-1-0-sdk

 

아래에는 관련 결과물을 촬영한 영상이다.

 

 

 

 

이제 Calibration 작업을 진행했으니 , 아마도 다음은 OpenGL 을 MFC에 붙여서 Point Cloud 환경을 구성하지 싶다.

그리고 이전에 진행하던 핸드트래킹 시스템을 Point Cloud 시스템에 붙여서 더욱 디테일 한 환경을 만들어보고싶다. 얼마나 걸릴지 모르지만..ㅋㅋ

앞으로 갈길은 정말 멀고도 험하구만.. 하지만 재밋다. 정말로 ^^

앞으로 어떠한 역경이 나를 또 괴롭힐지.. ㅎㅎ

 

------------------------------------------------------------------------------------


해당 프로젝트 파일을 원하시는 분들이 많아서 자로 함께 첨부합니다.

오래전 파일이라서 새로 프로젝트 파일 작성했구요,

구동환경은 VS2012, OpenCV 2.4.2, C++, Kinect SDK 1.8 이구요, Console 에서 구동 합니다.

RGB영상에 맞게 Depth 정보를 매핑 시키는 프로그램이구요, 이를 응용 및 활용하면 Point cloud 도 생성 가능합니다.


Kinect_DepthCalib_in_console(RGB, Depth with calib, OpenCV).vol1.egg


Kinect_DepthCalib_in_console(RGB, Depth with calib, OpenCV).vol2.egg


------------------------------------------------------------------------------------





Posted by Tommy™
,




요 몇주간 세미나 및 행사, 그리고 출장으로 인해 프로그램을 손볼수가 없었는데,


몇일동안 다시 으쌰 으쌰 해서 진도를 좀 나갔다.




이번에 한것은 손끝점 (Finger Tip) 찾기 인데,


이런저런 방법들을 많이 써봤는데 정리를 하면..


1. ConvexHull 을 이용하여 최외곽 포인트를 손끝점으로 인정
누구나 다 쓰는 국민알고리즘??이라고 해야하나..?? 어째뜬 가장 직관적이면서 이해하기 쉬운 방법이다. 다각형을 포함하는 가장 큰 외곽 태두리를 컨벡스헐 이라고 말하는데, 이를 이용하면 손을 피든, 쥐든, 손가락을 접든간에, 최 외곽선만 따기때문에, 쉽게 검출할수있다. 하지만.. 손가락 이외의것들, 예를 들면 손목이 잡힐수도 있다. 그러하여.. 사용X


2. 세선화를 통해 가장 끝점 좌표를 매칭
세선화를 통하여 정확한 손끝점을 찾을수가 있다. 하지만.. 가장 큰 문제인 퍼포먼스... 한마디로 이야기해서 저질이다. 프레임이 뚝!! 떨어진다. 실시간으로 영상을 처리해야하는 나의 프로그램으로는 아쉽지만.. 사용X


3. K-Curvature 를 이용하여 손끝점 찾기
세점을 이용하여 사이각을 구할수가 있다. 각각 점을 이용하여 두 벡터를 구할수 있고, 이 두 벡터를 이용하여 내적공식을 사용, 사잇각을 구할수가 있다. 이를 이용하여, Contours 에서 K개 단위로 조사하여 구해진 각이 일정범위 안이면 손끝점이라고 인지하게 하는것이다.
이차함수때부터 수학에서 손을 땐 나로써는 새로운 도전이었지만, 몇개의 논문과 구글링과 네이버 검색을 통해 식을 찾고 적용시켜 보기로 했다.


[참고 논문]
- Real-time Hand Tracking and Finger Tracking for Interaction (2003)
- Vision Based hand tracking for Interaction (2008)





그리고 몇일동안 씨름을 한 결과..


나름의 결과를 얻을수가 있었다.


하지만, 아직도 정형화 되지않은 나의 코딩실력으로 인해 프로젝트 소스코드는 너무도 난잡해졌다.. OTL...


조만간 다시 시간 내어 정리해야겠다.




(프로그램은 Debug 에서 30프레임을 유지하는데, 빌어먹을 인코딩으로 인해 느리게 나왔네;; 이런 ㅋㅋ)






 

Posted by Tommy™
,