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

수학에서 사용하는 용어를 영어로 표현하는 방법이 궁금해졌다.

 

그래서 찾아 본 결과, 아래와 같이 표현하고 있었다.

 

 

 

1. 정수 integer

양의 정수, 0, 음의 정수를 통틀어서 부르는 말

 

An Integer is any number that is not a fraction or decimal.

'정수는 분수나 소수가 아닌 모든 수입니다.'

 

 

2. 유리수 rational number

두 정수의 나눗셈으로 표시할 수 있는 수

 

 

3. 무리수 irrational number

실수 중에서 유리수가 아닌 수

 

Numbers that are not rational are called irrational numbers.

'유리수가 아닌 수를 무리수라고 부릅니다.'

 

 

4. 자연수 natural number

0보다 큰 정수

 

 

5. 실수 real number

유리수와 무리수 전체를 일컫는 말

 

 

6. 허수 imaginary number

실수가 아닌 복소수

 

 

7. 복소수 complex number

실수와 허수의 합으로 이루어지는 수

 

 

8. 소수

0보다 크고 1보다 작은 실수 decimal

1과 자신의 수 외에는 나눌 수 없는 숫자 prime number

 

 

9. 분수 fraction

전체에 대한 부분을 나타내는 수

 

 

10. 약수 divisor

어떤 수를 나누어 떨어지게 하는 수

 

 

11. 배수 multiple

어떤 수를 1배, 2배, 3배, …한 수

 

 

참고 : http://blog.naver.com/ilovalaska/50177014310

 

 

Posted by Tommy™
,

프로그램을 만들다보면 이런저런 예외처리나 에러가 날법한 곳에 메세지박스나 콘솔창에 디버그 결과를 띄울경우가 많다. 그러다 assert 매크로를 알게 되었는데, 너무나도 유용하면서 편하게 디버깅을 할수 있는 방법이다. 직접 블로깅 하려다가, 어떤 분께서 아주 정리를 깔끔하게 해놓으셔서 긁어오게 되었다. 출처 및 주소는 밑에..

 

 

" assert의 비법들 "

 

1. assert의 기본

  - assert 매크로 : 코드 상의 어떠한 가정을 철저하게 점검하기 위한 간단하면서도 부담 없는 방법

  - 항상 TRUE가 되어야 하는 조건식을 넣는다. 조건이 FALSE로 평가되면 assert는 문제가 생겼음을 알리는 대화상자를 띄운다.

  - 프로그램을 방어적으로 만들어 준다.

  - 디버그 빌드에서는 수행하지만 릴리즈 빌드에서는 assert 매크로가 컴파일되지 않는다. 그러므로 assert 안에서 프로그램의 상태를 변화시켜서는 안된다.

  #include <assert.h>

  void VectorNormalize( Vec* src, Vec* dst ) {

    assert( src != 0 );

    assert( dst != 0 );

  }

 

2. assert 비법_1) 더 많은 정보를 집어넣는다.

  - assert의 조건식에 더 많은 정보를 집어 넣는다.

  #include <assert.h>

  void VectorNormalize( Vec* src, Vec* dst ) {

    assert( src != 0 && "VectorNormalize::src vector pointer is NULL " );

    assert( dst != 0 && "VectorNormalize::dst vector pointer is NULL " );

  }

 

3. assert 비법_2) 좀더 많은 정보를 집어넣는다.

  - 프로그램의 실행이 도달하지 말아야 할 곳에 도달하는 상황을 감지하기 위해서 assert(0)를 사용하는 경우도 있다. 항상 실패.

  - 부정 연산자 사용

  - assert( !"VectorNormalize:: The code should never get here" );

 

4. assert 비법_3) 좀더 편하게

  - 두 개의 인자들을 받는데, 첫번째 것은 실제로 평가될 조건식이고 두번째 것은 디버깅 정보를 담는 문자열이다.

  - #define Assert(a,b) assert( a && b )

  - Assert( src != 0, "VectorNormalize::src vector pointer is NULL " );

    Assert( 0, "VectorNormalize:: The code should never get here" );

 

5. assert 비법_4) 커스텀 assert 만들기

  - assert보다 더 많은 기능을 가진 독자적인 검사 매크로를 만들 수 있다.

  - 디버거 하에서 조건이 실패ㅏㄹ 경우 소스파일 안의 assert 문이 아니라 assert.c 파일 안에서의 assert 문으로 들어가게 되는 경우 소스파일로 직접 들어가게 만들때 사용된다.

  #if defined(_DEBUG)

    extern bool CustomAssertFunction( bool, char*, int, char* );

  #define Assert( exp, description ) \

    if( CustomAssertFunction( (int)(exp), description, _LINE_, _FILE_) ) \

    { _asm { int 3 } }

  #else

  #define Assert( exp, description )

  #endif

 

6. assert 비법_5) 이것도 중요

  - 커스텀 assert 매크로를 만드는 경우에는 assert 대화상자에 다음부터 항상 무시 옵션을 추가하는 것이 좋다

  - 특정 assert 문에 대해서는 조건이 실패해도 대화상자를 표시하지 않고 무조건 넘어갈 수 있도록 하는 것이다.

  #if defined(_DEBUG)

    extern bool CustomAssertFunction( bool, char*, int, char* );

  #define Assert( exp, description ) \

    { static bool ignoreAlways = false; \

      if( !ignoreAlways ) { \

        if( CustomAssertFunction( (int)(exp), description, _LINE_, _FILE_) ) \

        { _asm { int 3 } }

      } \

    }

  #else

  #define Assert( exp, description )

  #endif

 

7. assert 비법_6) 초고수만 볼 것

  - VectorNormalize를 호출하는 곳이 많다면 VectorNormalize 안의 assert 문은 프로그램을 디버거에 붙여서 실행하지 않는 한 큰 도움이 되지 못한다.

  - assert 대화상자 안에 스택 정보를 표시하면 된다.

 

8. assert 비법_7) 좀 더 쉽게 복사해서 붙여 넣기

  - 스택 정보를 좀 더 쉽게 보존/저장할 수 있는 방법이 필요

  - 윈도우즈 환경에서의 한 가지 해결책은 클립보드를 이용하는 것

  - assert 대화상자에 작은 버튼을 하나 만든 다음 그 버튼을 클릭할 때 스택 정보가 클립보드에 복사되도록 하면 누구라도 쉽게 클립보드의 내용을 버그 리포트나 전자 우편에 붙여 넣어서 프로그래머에게 보낼 수 있다.

  - 임의의 문자열을 클립보드에 복사하는 윈도우즈 전용 코드

  if( OpenClipboard( NULL ) )

  {

    HGLOBAL hMem;

    char szAssert[256];

    char *pMem;

 

    sprintf( szAssert, "Put assert info here" );

    hMem = GloabalAlloc( GHND | GMEM_DDESHARE, strlen( szAssert ) + 1 );

 

    if( hMem)

    {

      pMem = (char*)GlobalLock(hMem);

      strcpy( pMem, szAssert );

      GlobalUnLock( hMem );

      EmptyClipboard();

      SetClipboardData( CF_TEXT, hMem );

    }

   

    CloseClipboard();

  }

Posted by Tommy™
,

예전에 자주 사용했었던 CFileDialog 클래스를 오랫만에 사용해보려고 하다보니깐, 기억이 안나더라.

 

그래서 이리 저리 찾아보다가 친절히 설명 해놓으신 블로거님의 블로깅 자료를 발견하고 공유하고자 살짝 가져왔다.

 

당연히 참조 경로는 하단부에 첨부했다.

 

 

****************** CFileDialog 정의
CFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWITEPROMPT, OPCTSTR lpszFilter = NULL, CWnd *pParentWnd = NULL)

bOpenFileDialog        TRUE--> 열기        FALSE--> 다른 이름으로 저장
lpszDefExt                기본 확장자. 만약 cpp라고 적으면 파일명이 자동으로 test.cpp가 됨
lpszFileName            대화상자가 처음 출력되었을 때 "파일 이름" Edit 컨트롤에 출력될 파일명 지정
dwFlags                   속성
     - OFN_EXPLOPER     윈도우 탐색기 스타일로 출력
     - OFN_ARROWMULTISELECT       파일을 한번에 여러개 선택 가능
     - OFN_CREATEPROMPT         존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 메시지 박스 출력
     - OFN_FILEMUSTEXIST     존재하지 않는 파일명을 입력할 수 없도록 함
     - OFN_HIDEREADONLY      읽기 전용 파일은 출력하지 않음
     - OFN_LONGNAMES          긴 파일 이름 포맷 지원
     - OFN_OVERWRITEPROMPT  존재하는 파일명을 입력했을 경우 덮어쓰겠냐는 메시지 박스 출력
     - OFN_PATHMUSTEXIST      이미 존재하는 디렉터리명만을 입력
lpszFilter                   대화상자에 출력될 파일들을 확장자에 의해서 걸러지도록 하기 위한 필터 지정
pParentWnd               대화상자의 부모 윈도우 지정



****************** CFileDialog 클래스의 멤버 함수
CString GetPathName       선택된 파일의 절대 경로
CString GetFileName        선택된 파일의 이름과 확장자
CString GetFileExt            선택된 파일의 확장자
CString GetFileTitle           선택된 파일의 파일명
BOOL GetReadOnlyPref     읽기 전용 여부

POSITION GetStartPosition           다중 선택의 경우
CString GetNextPathName



******************CFileDialog 클래스의 인스턴스를 선언하고 DoModal 함수 호출

** 한개의 파일만 선택할 경우
char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal())
{
        CString strPathName = dlg.GetPathName();
}


** 여러개의 파일을 복수 선택할 경우

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

if(IDOK == dlg.DoModal())
      for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
               m_ctrlListBox.AddString(dlg.GetNextPathName(pos));

 

 

 

 

참조 : http://egloos.zum.com/gomu0/v/2865574

 

2015/06/10 - [[ Topics ]/Visual Studio] - 파일 입출력에서 폴더창 열기

 

2014/05/01 - [[ Topics ]/Visual Studio] - CString 에서 경로, 파일명, 확장자를 구분하여 출력하는법

 

2015/06/10 - [[ Topics ]/Visual Studio] - Cstring 에서 char* 형으로 변환

 

2014/10/31 - [[ Topics ]/Visual Studio] - CString to int, int to CString 변환법

 

 

Posted by Tommy™
,