기본적으로 키넥트를 쓰는 이유중 한가지가 바로 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™
,




키넥트의 Skeleton 알고리즘은 공개되어있지 않다.

궁금하긴 하지만.. 당연 수학적인 요소들이 엄청나게 들어가있을꺼라 생각한다.

다음에 수학공부를 좀 더 해서 그때 파해쳐 봐야겠고... (이것만으로도 근데 논문 주제가 되겠다는 생각이...)



어째뜬 오늘은 SDK가 지원해주는 Skeleton 알고리즘을 이용하여 화면에 출력 해보았다.

함수는 NuiTransformSkeletonToDepthImageF(Vector4 vPoint, FLOAT *pfDepthX, FLOAT *pfDepthY) 를 이용하면 된다.

이함수는 각 관절의 위치를 얻어오는 함수인데, x,y 의 값을 얻어올수있다.

그런데 내가 원하는 데이터는 Z축 데이터 , 즉 깊이값!!

이는..

SkeletonPosition을 HRESULT NuiTransformSkeletonToDepthImageF(Vector4 vPoint, FLOAT *pfDepthX, FLOAT *pfDepthY, FLOAT *pfDepth) 

이 함수를 이용하면 얻어올수가 있는데,

각 Joint 마다 그 수치를 출력해봤는데, 매우 정확한듯했다.

키넥트.. 정말 잘만들고 정교하다......는걸 새삼 다시 느끼게 되었다.

말이 샜는데 어째뜬 이는 물론 키넥트 SDK 셈플소스에 추가되어있다.

(난 이것도 모르고 뻘짓을 몇시간동안이나...ㅠㅠ)

여기에는 매개변수가 총 3개가 들어가는데, 인터넷에서 검색해서 공부하고 찾아본 내용을 설명을 하자니.. 너무 광범위 하다.

그래서 블로그를 하나 소개 하겠다.


site : http://www.cyworld.com/krop_spiller/6824891

 

http://www.cyworld.com/krop_spiller (사이트 링크 수정 : 2012. 07.25)



여기인데, 알고보니 후배 블로그 였다는...

어째뜬 이곳에 가면 후배녀석이 아주 상세하고 자세하게 적어놓았다. (저도 여기서 공부했다는.. 헤헤 ^^;;)


이것은 나의 결과 스샷!!!

 

 



누군가가 도와줬으면 좋겠지만, 이때 연구실에 아무도 없었다는 ㅠㅠ

위에 보면 머리부분과 손이 가장 가까운데, 머리 부분을 보면 7560 이라 되어있다

이는 0.75m 가 떨어져있다는 소리겠지요??


참고로 나의 개발환경은..

Window 7 32bit,

Visual studio 2010

C++,  MFC

Kinect SDK 이다.

 

 

 

 

 

/*//////////////////////////////////////////////////////////////////////////

130923_추가.

//////////////////////////////////////////////////////////////////////////*/

 

소스코드를 보고싶어 하시는 분들이 많으셔서 업로드 하게 되었습니다.

 

그전에 말씀 드릴것은,

 

2012. 1. 6 에 만들었던 프로젝트 파일이며,

 

VS2010, OpenCV2.0, Kinect SDK beta2 버전입니다.

 

이사람은 이렇게 했었구나.. 라고만 참조하시면 좋을듯 합니다.

 

1년 반 전에 처음 키넥트SDK 가 나왔을때 공부목적으로 만든 소스코드라 엉망이라는점,

 

염두해주시면 감사하겠습니다. ^^

 

/*//////////////////////////////////////////////////////////////////////////

120106_Kinect_MFC(Depth, Skeleton with Z, depthdata).zip

//////////////////////////////////////////////////////////////////////////*/

 

 

 

 

Posted by Tommy™
,