Kinect 2.0을 구매한지 꽤~ 오래 되었지만, 드디어 맛 볼? 기회가 생겨서 이리저리 구동시켜 보았네요.

 

일단 기본 정보는 전에 포스팅 한것을 참조하시면 될듯 합니다.

 

2013/05/22 - [[ Topics ]/Kinect 2.0] - Xbox One & Kinect2 are announced!!

 

그래도 요약을 하자면,

 

Operating System: Windows 8.0 or 8.1 and Windows embedded standard 8

Field of view (RGB camera): 84.1º in horizontal , 53.8º in vertical

Field of view (IR camera): 70.6º in horizontal , 60º in vertical

Depth information: 0.5 ~ 8.0m (Reasonable distance: 0.8~4.0m), ToF(Time of Flight) camera

Color stream: 1920 X 1080 (16:9), YUY2, 30fps

Depth stream: 512 X 424, 30fps

IR stream: 512 X 424, 30fps

Data path: USB 3.0

 

대충 이렇습니다,

 

 

 

다른 블로거님의 포스팅을 빌려서 하드웨어 부분을 설명할께요 ^^;;

 

http://blog.naver.com/tachikomatic/220130374854

 

 

 

그리고 Kinect SDK 2.0 도 (한참전에) 출시가 되었습니다.

 

https://www.microsoft.com/en-us/kinectforwindows/develop/

 

여기로 가시면 바로 다운 받으실수 있어요.

 

 

 

제공된 샘플코드들을 실행해보고 느낀점은 훨씬 간단해졌다는 점이었습니다.

 

왜냐면 훨씬 잘 정돈 되어있었고, 간결해졌다고나 할까..??

 

또한 각각의 카메라 정보 (RGB, IR, Depth) 동시에! 획득 가능하다는 점!

 

개인적으로 제일 반가웠던 점입니다.

 

자체적으로 따로 구분 지어서 프로세스 되게 구축해놓은거 같더군요.

 

아무튼 개인적으로는 정말 희소식 입니다.

 

 

 

그리고, 혹시나 필요하신분들이 계실까봐 미천한 소스코드지만, 정리해서 올립니다. ^^;;;;;

 

프로그램은 콘솔 기반이구요, OpenCV 를 써서 영상을 출력 시켰습니다.

 

Kinect 2.0 장치를 초기화 및 구동하는데 필요한 부분만 SDK 샘플코드에서 발췌해서 만들었구요, RGB, IR, Depth 영상 따로 따로 CV윈도우 창 띄워서 출력 되게 만들었습니다.

 

좀 더 자세히 설명 드리자면.. Visual Studio 2012, OpenCV 2.4.2, Kinect SDK 2.0, C++, Console based 입니다.

 

아래 이미지들은 SDK에 있는 샘플소스코드들을 취합해서 만든 콘솔기반 프로그램에서 캡쳐한 영상들 입니다. 둘 다 쩍벌남이네요 ㅎㅎ (다리 좀 오므리고 찍을껄..)

 

 

KinectV2_Console_151027_RGB_IR_Depth_Complete.vol1.egg

 

KinectV2_Console_151027_RGB_IR_Depth_Complete.vol2.egg

 

 

Color image: 1920 X 1080 (16:9)

 

IR image: 512 X 424

 

Depth image: 512 X 424 (normalized in 0~255)

 

 

 

2013/05/22 - [[ Topics ]/Kinect 2.0] - Xbox One & Kinect2 are announced!!

 

2013/07/19 - [[ Topics ]/Kinect 1.0] - [KinectSDK 1.7]FaceTracking Test!

 

2013/02/28 - [[ Topics ]/Kinect 1.0] - Kinect의 IR-Camera 로의 접근

 

2012/04/24 - [[ Topics ]/Kinect 1.0] - RGB 이미지와 Depth 이미지의 Calibration

 

 

 

 

 

Posted by Tommy™
,

Map

 

map<key, value>   -> key에는 정렬될 값, value에는 필요한 값 (Key값을 기준으로 함께 쌍으로 저장 및 정렬됨)

 

중복된 키값을 허용 X

 

map 정렬방식

 

map<int, string, string.less<int>>    -> map의 오름차순 (그냥 map<key, value> 사용시 오름차순)

map<int, string, string.greater<int>>  -> map의 내림차순

 

 

map 추가방식

 

map<int, string> strMap;

strMap.insert( make_pair( 5, "Rjwu") );

strMap.insert( make_pair<int , string> (5, "RJwu")  );

 

삭제방식

 

strMap.erase(1);          키값 1의 Pair 가 사라짐

 

검색방식( 반환타입은 iterator)

 

map<int, string, string.greater<int>> :: iterator    iter;

iter = strMap.find(7);

 

cout << iter->first << "\t" << iter->second << endl;          //first 는 키값, second 는 데이터

 

 

multiMap

 

map과 달리

strMap[5] = "기륜"; 이런방식의 키값과 데이터 추가가 안된다.

또한 multiMap은 map 과 달리 중복된 키값을 허용한다. map 은 중복된 키값이 들어오면 나중에 들어온 pair 가 먼저것을 밀어냄

 

multimap 은 중복된 키값에 대하여 find로 검색시 먼저 들어온 데이터를 우선시한다.

multimap 은 중복된 키값에 대하여 erase 로 삭제 시 해당 키값에 해당하는 Pair 를 모두 삭제한다.

 

 

Include header

 

#include <map>

 

<map>만 추가해줘도 map, multimap 둘다 사용이 가능

 

#include <functional>

 

오름차순, 내림차순 정렬시, std::greater<key>, std::less<key> 를 사용하기 위한 헤더파일

 

 

http://stackoverflow.com/questions/16567699/stdgreater-not-defined-in-msvc2012

 

 

 

 

 

위의 블로그를 참고 했습니다.  (몇몇 필요한 내용은 추가 및 수정)

 

 

실제 사용 예 및 소스코드

 

Kinect의 depth값을 깊이 단위로 내림차순 정렬을 해야하는 경우가 발생했다.

 

처음에 map을 사용하셨지만, 치명적인 문제점이 key값이 중복이 안된다는 점!

 

depth 값이 중첩이 되는 값들은 저장이 안되고 날아가버리는 치명적인 문제가 발생했다.

 

하지만 multimap중복 ket값이 사용 가능하다.

 

그래서 map의 key 부분에 depth 값을, value값에 만든 구조체를 삽입하여 정렬했다.

 

 

//내림차순 정렬

multimap<float, RGBD, greater<float>> m_mapRGBD;

 

for( int h = 0 ; h < KINECT_RGBD_HEIGHT_MAX ; h ++ )
{
  for( int w = 0 ; w < KINECT_RGBD_WIDTH_MAX ; w ++ )
  {

    m_mapRGBD.insert( make_pair( rgbd.z, rgbd ) ) ;

  }

}

 

 

따라서 결과적으로 m_mapRGBD안에 depth값을 기준으로 자동 내림차순 정렬이 되어 문제를 해결하였다.

 


 

Posted by Tommy™
,

오늘은 FaceTrackLib 를 활용하여 눈동자를 트래킹하는 프로그램을 제작하였다

 

먼저 FaceTrackLib를 통해 얼굴을 트래킹 하면,

 

해당 vertex의 2차원 위치를 알수가 있다.

 

(참고로 vertex의 총 갯수는 121개이다)

 

여기서, 눈에 해당하는 부분만 따로 추출을 하여 눈에 해당하는 vertex를 추출할 수가 있는데,

 

이를 이용하여 눈동자를 트래킹 하게 되었다.

 

그리고 Translate, Rotate, Scale 값도 함께 라이브러리에서 제공한다.

 

결과물은 아래와 같다.

 

 

 

 

하지만 필요한것은 3차원 좌표..

 

그것도 영상의 사이즈에 depend 하기때문에, 이를 3차원에서의 좌표를추출해야 한다.

 

이제 depth map을 가지고 놀아봐야겠군..

 

 

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

 

 

[2014. 03. 27 Update]

 

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

 

거의 반년 이상 전에 공부하면서 만든 프로젝트 파일이라 시스템 구조가 엉망이라는 점 감안하고 올립니다.

 

뭐 이따구로 코딩해놨어~! 라고 하시면.. 안됩니다 ^^;;

 

환경은 Windows7, VS2010, MFC, C++, KinectSDK 1.7, OpenCV 2.4.2 이렇게 활용했습니다.

 

티스토리 10mb 업로드 용량 제한때문에 분할압축해서 올립니다.

 

궁금하신점은 제 메일로 연락주세요 ^^ (TommyHSM@gmail.com)

 

 

 

 

 

 

KinectFaceTracker(130724_눈영역검색 및 취합, 4가지 버전_소스코드_불필요한부분_수정).vol1.egg

 

KinectFaceTracker(130724_눈영역검색 및 취합, 4가지 버전_소스코드_불필요한부분_수정).vol2.egg

 

 

 

 

 

 

 

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

[KinectSDK 1.7]FaceTracking Test!  (18) 2013.07.19
Kinect SDK 1.7 coming at March 18  (0) 2013.03.18
Kinect의 IR-Camera 로의 접근  (0) 2013.02.28
Kinect SDK 1.6 맛보기  (0) 2013.02.28
1-inch UniTouch System using Kinect  (0) 2013.01.30
Posted by Tommy™
,

오늘 테스트 결과물은 Kinect SDK 1.7 에서 제공되는 FaceTrackingVisualization 을 뜯어보고, 나만의 프로젝트로 이식하기 까지다.

 

글의 서두이자 테스트하게 된 이유는,

 

연구실의 박사님께서 얼굴을 트래킹하는 프로그램을 하나 부탁하신게 있어 시작하게 되었다.

 

먼저 조사결과, 얼굴을 robust 하게 tracking 할수 있는 방법은 2가지로 줄일수 있는데,

 

1. FaceAPI

 

2. KinectSDK - FaceTrackLib

 

하지만, FaceAPI는 유료이기때문에.. 패스!

 

Kinect SDK 에서 제공하는 SDK는 무료이기 때문에, 이녀석을 뜯어보고 사용하기로 결정했다.

 

 

 

 

 

일단 FaceTrackingVisualization 에서는 크게 2가지로 나누고 있다.

 

1. MultiFace

 

2. SingleFace

 

하지만 나는 얼굴 하나만 트래킹 하면 되기에 싱글을 뜯어보기로 했다.

 

샘플을 돌려보면 알겠지만, 왼편에 원처럼 생긴곳에 트래킹 얼굴을 따라 아바타가 나타나고, 오른편에는 얼굴을 따라 삼각형 메쉬덩어리들이 얼굴위에 뙇! 나타난다.

 

내가 필요한 부분은 삼각형 메쉬 덩어리들이기때문에, eggavatar 부분은 버리고,

 

키넥트로 부터 영상을 받아오는 부분과, 얼굴을 detect 하는부분, 이렇게 찾아본 결과,

 

KinectSensor = 키넥트에서 영상을 받아오는 부분 (순수 키넥트 영상)

 

SingleFace = 키넥트에서 받아온 영상을 처리하여 얼굴을 찾는 부분

 

Visualize = 삼각형 메쉬를 그려주는 부분

 

이렇게 3가지 부분으로 정리되었다.

 

 

 

 

 

그리고 중요한 점!

 

여기서는 Depth 와 Skeleton Tracking 을 통해 머리와 목을 트래킹 하여 얼굴영역을 트래킹 한다는 사실!

 

그리고 Depth 영상의 Resolution은 320 X 240 이라는 사실!

 

(Color 영상은 640 X 480 이다.)

 

마지막으로 GetClosestHint() 함수를 통해 가장 가까운 사람을 Detect 한다는 사실!

 

 

 

 

다음으로

 

영상을 어떻게 출력해줄것인가..??

 

나는 OpenCV를 사용하여 MFC 의 Picture Control 영역에 뿌려주기 위해 작업을 했다.

 

그리고 하면서 알게 된 결과..

 

여기서 영상을 출력해주기 위해 사용하는 영상 포멧은 IFTImage 이고, 4channel 로 이루어져있다는 사실..

 

 

 

 

 

 

이제 필요한 부분과 필요없는 부분을 골라내서 마무리!

 

대충 결과물은 아래와 같다. (이미지와 영상 참조)

 

(이미지는 얼굴영역을 어떻게 잡나 보여주기위해, mesh를 제거하였다.)

 

개발환경 : Window 7, Kinect SDK 1.7, VS 2010, C++, MFC

 

 

 

 

 

 

 

 

 

 

 

결과.

 

트래킹이 잘된다.

 

하지만 문제점이 있는데,

 

어느정도 가까워지면 트래킹이 끊어진다. (아마도 스켈레톤을 하지 못해서 이지 않을까.. 라는 생각 )

 

그리고 한번씩 인식된 부분이 튄다는점인데..

 

뭐 앞으로 마소 에서 개선하겠지??

 

이제, 내부구조를 조금 더 파해쳐보고, 수확이 있으면 다음번 포스팅에 올릴예정이다.

 

 

 

 

Posted by Tommy™
,

원본 : http://blogs.msdn.com/b/kinectforwindows/archive/2013/03/16/kinect-for-windows-announces-new-version-of-sdk-coming-march-18.aspx

 

드디어 학수고대 하던 Kinect SDK 1.7 버전이 업데이트 된다고 한다.

 

뜬 소문에 의하면 1.7버전에는 Kinect Fusion 이 포함되어서 출시가 된다고 하였는데,

 

그것이 실제로 공식적으로 언급이 된것이다.

 

이부분에서는 정말 많은 분들이 Kinect Fusion을 기다리고 있었을거라 생각이 되는데, 나 또한 마찬가지다.

 

Kinect Fusion에는 정말 많은 기술이 집약되어 있는데,

 

가장 큰 특징은 실시간 랜더링이 되어 3D 데이터를 추출 할 수 있고, 이를 통해 물리도 적용이 되어 현실과 가상간의 커다란 연동이 되며, 또한 이를 통해 3D 스케너가 필요가 없어지게 되기 때문이다.

 

 

 

 

이외에도 1.7버전에는 더욱 발전한 개발자 툴킷을 추가 했다고 한다.

 

  • OpenCV and MATLAB Samples to allow developers to build advanced Kinect-enabled applications while using industry standards.
  • Kinect for Windows Code Samples on CodePlex, marking the first time that select Kinect for Windows code samples will be available through an open-source resource, enabling existing and potential partners to explore and develop new scenarios.
  •  

    영상처리나 컴퓨터 비전을 공부하는 사람들은 다 아는 OpenCV 와 MatLab이 있는데, 이를 위한 샘플이 추가 되어 나온다고 한다.

     

    더욱 놀라운 점은 모두다 Open Source라는점!!

     

    정말 대단하다 Microsoft...

     

    알면알수록 더욱 무궁무진한 Kinect, 정말 매력적인 녀석인것만은 틀림없다.

     

    자, 여러분도 함께 1.7 버전으로 가서 Kinect Fusion 한번 구동 해봅시다 ^^

     

    Website : http://www.microsoft.com/en-us/kinectforwindows/

     

     

     

     

    Posted by Tommy™
    ,