1-inch UniTouch System using Kinect

 

Dept. of Visual Contents, Dongseo University

Seok-Min Hong, Yung-Fu Tan, Hui-Shyong Yeo, Byung-Gook Lee

 

TommyHSM@gmail.com
leebyunggook@gmail.com

http://TommyHSM.tistory.com/

http://kowon.dongseo.ac.kr/~lbg/

 

This research was supported by Basic Science Research Program through the National Research Foundation of Korea(NRF) funded by the Ministry of Education, Science and Technology

 

Dongseo University, IAI Lab

 

- Acting by Seok-Min Hong (TommyHSM@gmail.com)
- Filming & edit by Byung-Hyun Ryu (
udambaraz@naver.com)

 

 

 

Posted by Tommy™
,

오랫만에 키넥트랑 만나서 작업을 진행중에 있다.

 

그래서 오늘의 주제도 당연히 키넥트 함수 관련된 이야기이다.

 

처음 키넥트를 초기화 할때 NuiInitialize()를 통해서 RGB, Depth or Depth with Player Index, 그리고 Skeleton 의 설정을 할수가 있다.

 

그리고 키넥트를 종료시 NuiShutdown() 과 Release()를 통해 키넥트는 완전히 종료가 된다.

 

 

 

하지만, 지금 내가 하고 있는 작업에서는 사용자가 직접 키넥트를 종료시켰다가 다시 실행시키기를 반복할수 있어야 한다.

 

이때 발생 하는게 NuiInitialize() 뻑 (자칭) 이 되겠다.

 

NuiInitialize() 뻑이 나게되면 증상은 아무런 반응이 없이 프로그램은 저~기 안드로메다로 떨어지고 만다. 결국 종료..

 

이러한 문제점을 해결하기위해 3시간동안의 고군분투..

 

 

 

답은 여기 있었다.

 

(링크)http://www.microsoft.com/en-us/kinectforwindows/develop/release-notes.aspx#_6._known_issues

 

 

 

이곳에 들어가면 여~러가지 Release Notes Information 이 있는데, 그중에서 C++ 란에 가게되면 정확히 명시가 되어있다.

 

프로그램을 시작할때에는 SetDeviceStatusCallback 을 반드시  호출해야 한다고 말이다.

 

그리하여 문제 해결..!! 푸하~

 

 

 

거참.. 왜 프로세스를 이렇게 만들어놓았을까.. 라는 생각과 해결했다! 라는 생각이 교차되면서 뭔가 허무하기도 했다.

 

그리고 드는 생각이 Kinect SDK도 역시 마소 천재들이 만들지만 그사람들도 사람이구나.. 라는 생각 들었다.

 

그 누구든 완벽할수는는법!! 완벽해지려고 하는것일뿐..

 

 

 

 

이상 끗.

 

 

Posted by Tommy™
,

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

 

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

 

어째뜬, 오늘 글을 끄적이는 주제는 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™
,

TUIO 예제 소스코드를 몇시간 분석 후 대충 어떻게 돌아가는지 공부했다.

C++ 예제 소스도 첨부~~ (당신의 시간은 소중하니깐... = > )








나는 키넥트의 스켈레톤을 이용하여 양손의 위치정보를 이용하여 멀티터치 기능을 구현해 보았다.

정작 7시간?? 이 걸렸다.

프로그래밍의 구조를 막 생각하다가..

나중에는 막코딩을 해서 지금 구조는 엉망인데,

다음주나 되서 리팩토링을 하여 좀 다시 구조를 잡아야 겠다.



동영상은 혼자 촬영하다보니 허접한데, 다시 조만간 촬영해야겠다.

(카메라 든손도 움직이다보니 화면보니깐 어질어질;;)

'[ Topics ] > TUIO' 카테고리의 다른 글

TUIO 시작 및 참조  (0) 2012.01.07
Posted by Tommy™
,