요즘 새로운? 프로젝트가 시작 되었습니다.

 

Kinect v2 를 여러대 활용하여 연구? 보다는.. 연구에 활용하기 위한 공부를 시작하고자 하는데, 문제는 Kinect SDK 2.0 은 1개의 PC당 1개의 Kinect v2 만 연결이 되도록 한정 지어놨다는 점입니다.

 

이를 해결할 방법을 찾다가 Freenect2 라는 오픈소스 라이브러리가 있더군요.

 

예전에 초창기 Kinect v1이 나왔을떄 Freenect 에서 해킹을 해서 이를 오픈소스로 유포한걸로 기억하는데, 거기서 다시 Kinect v2를 활용하는 방법을 제공하네요.

 

( 사이트는 여기로: https://github.com/OpenKinect/libfreenect2 )

 

간단히 둘러보니, libusb 를 활용하여 스트리밍 데이터를 받아들이는데, 말그대로 중간에서 Freenect2가 각각의 고유번호 및 USB 통신을 컨트롤 해서 다중 키넥트 환경을 제공 해주는거 같습니다. 그리고 픽업 된 영상은 OpenNI 2.0을 활용하여 결과물을 보여주고 있구요. 기호에 따라 OpenGL, OpenCL, CUDA 등등 기능도 같이 컴파일하여 활용할수있도록 해놓았습니다.

 

하지만 다른 블로거 유한규님 (URL: https://hanquel.postype.com/post/28254 ) 블로그를 보면 아직은 다중 키넥트 환경이 안정적이지는 않다고 하시는거보니 아무래도 한계점은 있는것 같아 보입니다.

 

일단은 저도 기본적인 multi Kinect v2 까지 테스트 해보고 Freenect2 컴파일 방법 및 연결 방법등을 찬찬히 설명 해보겠습니다.

 

Comming soon!

 

 

Posted by Tommy™
,

기본적으로 키넥트를 쓰는 이유중 한가지가 바로 Point cloud 때문이지 않을까 생각됩니다.

 

이는 여러 분야에서 아주 범용적으로 쓰이는 유용한 데이터 라고도 할 수 있겠네요.

 

Kinect를 활용하여 Point cloud를 만들기 위해서는 두가지의 다른 영상정보 (RGB, Depth (or Z)) 를 정합을 해야 합니다.

 

이는 Kinect v1.0때도 마찬가지였지만, v2.0에서도 방법이 있지 않을까 해서 해당 방법을 알아보았습니다.

 

역시 클래스와 함수로 잘 정리 되어있었네요.

 

아래 링크를 들어가보시면 아시겠지만, 이번 SDK 에서 확실하게 강화시켜 놓았습니다.

 

CoordinateMapper Class가 따로 있고, 밑에는 해당 methods 들이 나열 되어있는것을 확인 하실수 있어요.

 

http://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.aspx

 

더욱 더 인상 적인점은, 키넥트 1.0 에서는 없었던 RGB camera to IR camera mapping 기능이 들어있습니다.

 

(저는 이 방법이 필요해서 직접 구현을 했다만.. 이제는 편해졌네요 ㅎㅎ)

 

 

 

 

아래는 저의 소스 및 결과물 입니다.

 

RGB 영상 좌표를 Depth 영상 좌표로 변환, 매핑하는 방법인데요,간단히 설명 드리면..

 

1. RGB 영상의 좌표정보(혹은 RGB coordinate's array)을 Depth 영상 좌표에 맞게 변환 (MapColorFrameToDepthSpace 함수 사용)

 

2. 변환된 RGB 영상 좌표정보를 활용하여 2가지 영상을 제작

a. Depth 영상 해상도 (512 X 424) 로 변환

b. RGB 영상 해상도 (1920 X 1080) 로 변환 

 

RGB to Depth resolution 결과물 (a) 영상에서는 노이즈를 보실수 있습니다.

 

이는 제가 겪었던 문제와 동일한데, 정수형의 픽셀배열이 사영변환 (projective transformation)을 통해서 재배치 될때 좌표가 실수형으로 바뀝니다. 

 

그리고 영상을 출력시 다시 정수형 좌표계(pixel coordinate)로 표현이 되는데, 이때 소숫점 자리는 무시가 됩니다. 

 

따라서, 결과적으로 픽셀 사이에 빈 공간이 생기게 되고, 이것이 저런 노이즈로 나타나게 됩니다.

 

 

 

 

아무튼 아래 소스코드들을 참고하셔서 활용하시면 될듯 하네요. (맘에 드신다면요.. ㅎㅎ)

 

 

 

 

RGB 영상 (1920 X 1080)

 

Depth 영상 (512 X 424)

 

a. Depth 영상 해상도 (512 X 424) 로 변환

 

b. RGB 영상 해상도 (1920 X 1080) 로 변환 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    //RGB frame to Depth space
    m_pCoordiMapper->MapColorFrameToDepthSpace(_IR_Width_ * _IR_Height_, m_pRealDepth, _Color_Width_ * _Color_Height_, m_pDepthSpacePoint);
 
    for(int h = 0; h < _Color_Height_; h++)
    {
        for(int w = 0; w < _Color_Width_; w++)
        {
            index = h*_Color_Width_+w;
            _X = (int)(floor(m_pDepthSpacePoint[index].X + 0.5f));
            _Y = (int)(floor(m_pDepthSpacePoint[index].Y + 0.5f));
 
            if ((_X >= 0) && (_X < _Color_Width_) && (_Y >= 0) && (_Y < _Color_Height_))
            {
                index_3_DtoRGB = h * m_pCVMgr->m_pImg_3_Merge_DtoRGB->widthStep + w * m_pCVMgr->m_pImg_3_Merge_DtoRGB->nChannels;
                index_3_RGBtoD = _Y * m_pCVMgr->m_pImg_3_Merge_RGBtoD->widthStep + _X *m_pCVMgr->m_pImg_3_Merge_RGBtoD->nChannels;
 
                //DepthtoRGB resolution
                m_pCVMgr->m_pImg_3_Merge_DtoRGB->imageData[index_3_DtoRGB] = m_pColorRGBX[index].rgbBlue;
                m_pCVMgr->m_pImg_3_Merge_DtoRGB->imageData[index_3_DtoRGB+1= m_pColorRGBX[index].rgbGreen;
                m_pCVMgr->m_pImg_3_Merge_DtoRGB->imageData[index_3_DtoRGB+2= m_pColorRGBX[index].rgbRed;
                //RGBtoDepth resolution
                m_pCVMgr->m_pImg_3_Merge_RGBtoD->imageData[index_3_RGBtoD] = m_pColorRGBX[index].rgbBlue;
                m_pCVMgr->m_pImg_3_Merge_RGBtoD->imageData[index_3_RGBtoD+1= m_pColorRGBX[index].rgbGreen;
                m_pCVMgr->m_pImg_3_Merge_RGBtoD->imageData[index_3_RGBtoD+2= m_pColorRGBX[index].rgbRed;
            }
        }
    }
cs

 

 

 

 

 

2015/10/29 - [[ Topics ]/Kinect 2.0] - Kinect 2.0 & Kinect SDK 2.0 (Sample source code uploaded)

 

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

 

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

 

2013/03/26 - [[ Topics ]/3Gear System SDK] - 3Gear System SDK - Kinect Positioning and Setting

 

 

 

 

Posted by Tommy™
,

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™
,