본문 바로가기

IT/ARtoolkit

ARToolKit 1


Developing your First Application, Part 1에 나오는 함수들의 의미!

 

1. init // 초기화 함수

 

static void init( void )
{
    ARParam  wparam;
 
    /* open the video path */
    if( arVideoOpen( vconf ) < 0 ) exit(0);
    /* find the size of the window */
    if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0);
    printf("Image size (x,y) = (%d,%d)\n", xsize, ysize);

    /* set the initial camera parameters */
    if( arParamLoad(cparam_name, 1, &wparam) < 0 ) {
        printf("Camera parameter load error !!\n");
        exit(0);
    }
    arParamChangeSize( &wparam, xsize, ysize, &cparam );
    arInitCparam( &cparam );
    printf("*** Camera Parameter ***\n");
    arParamDisp( &cparam );

    if( (patt_id=arLoadPatt(patt_name)) < 0 ) {
        printf("pattern load error !!\n");
        exit(0);
    }

    /* open the graphics window */
    argInit( &cparam, 1.0, 0, 0, 0, 0 );
}

 

①ARParam  wparam;

 

AR 파라미터인 wparam을 정의. pram.h에 정의 되어 있다.

 

/** \struct ARParam
* \brief camera intrinsic parameters.
*
* This structure contains the main parameters for
* the intrinsic parameters of the camera
* representation. The camera used is a pinhole
* camera with standard parameters. User should
* consult a computer vision reference for more
* information. (e.g. Three-Dimensional Computer Vision
* (Artificial Intelligence) by Olivier Faugeras).
* \param xsize length of the image (in pixels).
* \param ysize height of the image (in pixels).
* \param mat perspective matrix (K).
* \param dist_factor radial distortions factor
*          dist_factor[0]=x center of distortion
*          dist_factor[1]=y center of distortion
*          dist_factor[2]=distortion factor
*          dist_factor[3]=scale factor
*/

typedef struct {
    int      xsize, ysize;
    double   mat[3][4];
    double   dist_factor[4];
} ARParam;

  

 

② if( arVideoOpen( vconf ) < 0 ) exit(0);

 

  AR_DLL_API  int    arVideoOpen(char *config);

    

   video.h에 보면 자세한 arVideoOpen에 대한 설명이 나와있다.

 

/**
 * \brief open a video source.
 *
 * This function opens a video input path with the
 * driver (and device) present on your platform.
 * According to your operating system and the
 * hardware the initialization will be different : a
 * generic string structure is used for this issue.
 * This function prepares the video stream for capture,
 * but capture will not actually begin until arVideoCapStart
 * is called.

 * \param config string of the selected video configuration.
 * See the <a href="video/">video configuration documentation</a>
 * for more information on this parameter.
 * \return 0 if successful, -1 if a video path couldn't be opened
 */ 

int arVideoOpen( char *config ) {
   if( gVid != NULL ) {
        printf("Device has been opened!!\n");
        return -1;
    }
    gVid = ar2VideoOpen( config );
    if( gVid == NULL ) return -1;
}


 캡쳐 화면 오픈에 실패하면 -1을 리턴하므로 if( arVideoOpen( vconf ) < 0 ) exit(0);는 캡쳐 화면 오픈에 실패하였을때 종료하게 만드는 문장이다.

 

 

③ if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0);

 

arVideoInqSize역시 video.h에 함수에 대한 자세한 설명이 나와있다.

/**
 * \
brief get the video image size, in pixels.
 *
 * This function returns the size of the captured video frame, in
 * pixels.
 * \param x a pointer to the length of the captured image
 * \param y a pointer to the width of the captured image
 * \return 0 if the dimensions are found successfully, otherwise -1

 */

AR_DLL_API  int    arVideoInqSize(int *x, int *y);

 

소스는

 

int arVideoInqSize( int *x, int *y )
{
    if( open_flag == 0 ) return(-1);

    *x = image.Width();
    *y = image.Height();

    return(0);
}

 

if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0);

 

arVideoInqSize(&xsize, &ysize) 함수를 통해 사진의 사이즈를 입력받고 입력 받지 못했을 경우 프로그램을 종료(성공시 0, 실패시 -1을 리턴하므로) 시키는 문장.

 

 

④printf("Image size (x,y) = (%d,%d)\n", xsize, ysize);

 

앞서 입력 받은 이미지 사이즈를 콘솔창에 출력해준다.

 

 

/* set the initial camera parameters */
    if( arParamLoad(cparam_name, 1, &wparam) < 0 ) {
        printf("Camera parameter load error !!\n");
        exit(0);
    }
    arParamChangeSize( &wparam, xsize, ysize, &cparam );
    arInitCparam( &cparam );
    printf("*** Camera Parameter ***\n");
    arParamDisp( &cparam );

 

 

주석에 달린 내용 대로 카메라 매개변수들을 초기화 해주는 내용일 것이다. 하지만 한 번 자세히 살펴보자.

 

arParamLoad(cparam_name, 1, &wparam)

 

역시 param.h에 보면 함수에 대한 자세한 설명이 나온다.

 

/** \fn int arParamLoad( const char *filename, int num, ARParam *param, ...)
* \brief load the camera intrinsic parameters.
*
* Load camera intrinsic parameters in the ARToolkit Library from
* a file (itself, an output of the calibration step).
* \param filename name of the parameters file.
* \param num number of variable arguments
* \param param result of the loaded parameters
* \return 0 if success, -1 if Error (file not found, file structure problem)
*/

int    arParamLoad( const char *filename, int num, ARParam *param, ...);

 

자세한 소스는 paramFile.c(152) 에 있는데 소스 내용이.. -_-; 내 수준을 넘어섰군;; 라이브러리 만세!

 

헤더 파일에 있는 내용을 바탕으로 보면, cparam_name이 가르키는 곳("Data/camera_para.dat")에 저장된 내용을 wparam에 넣으라는 것 같다.

 

 

arParamChangeSize( &wparam, xsize, ysize, &cparam );

 

역시 param.h에 함수에 대한 자세한 설명이 나와있다.

 

/** \fn int arParamChangeSize( ARParam *source, int xsize, int ysize, ARParam *newparam )
* \brief change the camera size parameters.
*
* Change the size variable in camera intrinsic parameters.
* \param source name of the source parameters structure
* \param xsize new length size
* \param ysize new height size
* \param newparam name of the destination parameters structure.

* \return 0
*/

int arParamChangeSize( ARParam *source, int xsize, int ysize, ARParam *newparam );

 

cparam은 위쪽에서 전역변수로 선언되어 있다.

 

ARParam         cparam;

wparam에 저장된 내용을 읽어와, x,y size를 다시 설정한 다음(초기 화면에서 화면 크기 조절하는 거로 하는 듯!?) 그 정보를 다시 cparam에 넣어라.

 

arInitCparam( &cparam );

 

/**
* \brief initialize camera parameters.
*
* set the camera parameters specified in the camera parameters structure
* *param to static memory in the AR library. These camera parameters are 
* typically read from a data file at program startup. In the video-see through
* AR applications, the default camera parameters are sufficient, no camera
* calibration is needed.
* \param param the camera parameter structure
* \return always 0
*/

int arInitCparam( ARParam *param );

 

소스를 보면,

 

int arInitCparam( ARParam *param )
{
    arImXsize = param->xsize;
    arImYsize = param->ysize;
    arParam = *param;

    return(0);
}

 

이런데 cparam에 저장된 정보로 카메라 정보를 초기화하는 듯 하다.

 

ⓓarParamDisp( &cparam ); 

 

/** \fn int arParamDisp( ARParam *param )
* \brief display parameters.
*
* Display the structure of the camera instrinsic parameters argument.
* \param param structure to display
* \return 0
*/

int    arParamDisp( ARParam *param );

 

cparam에 있는 정보 출력

 

 

    if( (patt_id=arLoadPatt(patt_name)) < 0 ) {
        printf("pattern load error !!\n");
        exit(0);
    }

 

ⓐpatt_id는 정수형 변수로 전역변수로 설정되어 있다.

 

arLoadPatt(patt_name)

ar.h에 함수에 대한 자세한 정보가 나와있다.

/**
* \brief load markers description from a file
*
* load the bitmap pattern specified in the file filename into the pattern
* matching array for later use by the marker detection routines.
* \param filename name of the file containing the pattern bitmap to be loaded
* \return the identity number of the pattern loaded or ? if the pattern load failed.
*/

int arLoadPatt( const char *filename );

 

패턴 정보가 저장되어 있다면, 그 정보를 읽어들이고 '패턴의 숫자-1'을 리턴한다. 만약 저장된 패턴이 없거나 파일을 읽어오는데 실패했다면 -1을 리턴한다.

 

patt_name은 "Data/patt.hiro"로 전역변수로 정의되어 있다.

 

 

    /* open the graphics window */
    argInit( &cparam, 1.0, 0, 0, 0, 0 );

 

gsub.h에 함수에 대한 설명이 적혀있다.

 

/** \fn argInit( ARParam *cparam, double zoom, int fullFlag, int xwin, int ywin, int hmd_flag )
* \brief Initialise the gsub library
*
*  This function performs required initialisation of the gsub library.
*  It must be called before any other argl*() functions are called.
* \param cparam the intrinsics parameters of the camera (used to defined openGL perspective matrix)
* \param zoom defined a zoom parameter for the final result.
* \param fullFlag full screen mode (1 enable, 0 disable).
* \param xwin XXXBK. 0 if indifferent.
* \param ywin XXXBK. 0 if indifferent.
* \param hmd_flag enable stereo display mode (only interleaved configuration)

*/
void argInit( ARParam *cparam, double zoom, int fullFlag, int xwin, int ywin, int hmd_flag );

 

캡쳐 화면 출력 해주는 함수인듯

 

 

2. main 함수

 

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    init();

    arVideoCapStart();
    argMainLoop( NULL, keyEvent, mainLoop );
    return (0);
}

 

① glutinit(&argc, argv);

 

OpenGL 함수 초기화를 해준다고 하는데 자세한 설명은 살짝 찾아봤는데 잘 안보인다 -_-;;;

 

찾으면 좀 업데이트 해주길..

 

② init();