카메라 캘리브레이션

카메라 캘리브레이션으로 3차원의 공간과 그것을 바라보는 카메라의 위치관계를 파악할 수 있다.

기초 중 기초인 것을 다시 확인하게 되었다.


도움되는 글.

http://openshareit.tistory.com/entry/Camera-Calibration-with-Homography

http://darkpgmr.tistory.com/32



iPhone4 AR with Gyroscope




같은 어플을 iPhone 3GS에서 Digital Compass만 이용했을 때와,
iPhone4에서 Gyro를 이용했을 때의 차이를 극명히 보여주는 영상이다. 
<참고 : http://brucemoon.net/1198141647>

 Gyro 센서와 가속도 센서와의 가장 큰 차이점은 이전 가속도 센서는 중력과 관련된 움직임만을 받았기
때문에 지면과 수평한 회전은 인식이 불가능했다는 것이고, 자이로는 이것을 인식가능하다는 점이다.
<네이버 맥부기 사이트 '가속도계 센서랑 자이로 센서랑 틀린건가요?'라는 글의128bit님의 답변 참조> 

 

AR in Web - by Unity Engine


Clash Of The Titans - Release The Kraken from Pleribus on Vimeo.

Clash of the titans promotion.

Developed by  Boffswana

FLARToolKit Start Guide by Saqoosha.net

** http://saqoosha.net/flartoolkit/start-up-guide/ 를 번역, 의역하였습니다.
** 원작자인 Koyama Tomohiko는 주로 플래시를 이용한 웹 서비스 제작을 하시는 분 같습니다.
   http://katamari.co.jp/#/index/hiko 이곳에 다양한 작품이 들어가 있습니다.



필요한 것

 ・Adobe Flash CS3 이후 버전
FLARToolKit
Papervision3D (rev.814 이후 버전)
・Web 카메라
・인쇄한 마커와 마커 데이터

다운로드

귀찮기 때문에 필요한 파일을 모두 모아 두었습니다.
http://saqoosha.net/lab/FLARToolKit/FLARToolKit-starter-kit.zip
덧붙임(2009/2/8 1:50): 으아~, 마커 pdf 넣은 것을 잊어버렸네요. 다시 넣어두었고 마커만 업로드한 이곳을 이용해 주세요.

Introduction

Papervision3D를 사용할 수 있는 분이라면 굉장히 간단합니다. 샘플의 메인부분은 거의 Papervinios3D 설정만 하면 됩니다.
써본 적이 없는 분께도 이 샘플은 엄청 간단하므로 어렵지 않아요. 걱정하지 않으셔도 됩니다.
단, 1가지 점에만 주의해주세요. 좌표계가 Papervision3D와 조금 다릅니다. Papervision3D으로 렌더링을 하기 때문에 글로벌 좌표계는
물론 왼손좌표계이지만, 마커 위에 올려진 오브젝트는 아래의 그림과 같은 느낌으로 마커를 정면에서 볼 때에는 오른손 좌표계가 됩니다. (**원문과 동일하게 표현해놓았습니다.) 윗 방향이 +X, 오른쪽 방향이 +Y, 앞쪽이 +Z가 됩니다.(덧붙임 2009/3/2 : 죄송합니다. 틀린 부분이 있었네요..)
marker-axis

샘플 소스의 설명

순서대로 쓸수록 어려워지기 때문에 소스를 조금씩 설명하겠습니다. SimpleCube.as 가 메인으로, 그 외의 소스는 특별히 볼 필요는 없습니다. 그러므로 SimpleCube.as 를 설명해 나가겠습니다.

17 번째 줄
this.init('Data/camera_para.dat', 'Data/flarlogo.pat');

FLARToolKit 를 초기화 합니다. 첫번째 인수에는 카메라 보정 파일의 이름입니다. 이 파일은 FLARToolKit 에 들어가있는 것으로 그대로 지정해두면 됩니다. 두번째 인수는 마커의 패턴을 정의하는 파일으로, 이 파일은 사용하는 마커에 대응하는 패턴 정의 파일을 지정합니다. flarlogo.pat 는  flarlogo-marker.pdf 용입니다。

20 번째 줄
protected override function onInit():void {

init 호출한 뒤, 초기화가 문제없이 끝나면 최종적으로 이 함수가 호출됩니다. 3D 오브젝트의 설정은 이 코드 안에 작성하면 되겠습니다. 패턴 파일이 존재하지 않거나 웹 카메라가 접속되어 있지 않다면, 이 함수가 호출되기 전에 에러가 발생합니다..

24, 25 번째 줄

var wmat:WireframeMaterial = new WireframeMaterial(0xff0000, 1, 2);this._plane = new Plane(wmat, 80, 80);

마커가 정상적으로 인식되고 있는지 확인하기 쉽게 마커와 동일한 사이즈의 Plane 을 만들어 보겠습니다. 빨간색 2px의 라인, 80 이 마커 사이즈 입니다. 80mm.

26 번째 줄
this._plane.rotationX = 180;

좀 전에 작성한 것과 같이 좌표계가 다르기 때문에 방향을 바꿉니다.

27 번째 줄

this._baseNode.addChild(this._plane);

통상적으로、Papervision3D에는 Scene3DaddChild 하지만, FLARToolKit 에서는 마커의 따라서 3D 오브젝트를 움직이기
위해 특별한 노드에 addChild 하는 필요가 있습니다. 그것이 _baseNode입니다. 여기에 addChild 하는 것으로 자동으로 마커를 따라 움직이도록 합니다.

36, 37 번째 줄
var fmat:FlatShadeMaterial = new FlatShadeMaterial(light, 0xff22aa, 0x75104e);this._cube = new Cube(new MaterialsList({all: fmat}), 40, 40, 40);

마커 위에 핑크색 Cube 를 올려보겠습니다. 사이즈는 40mm x 40mm x 40mm으로 마커의 반 정도의 사이즈입니다.

38 번째 줄
this._cube.z = 20;

Cube 는 원점을 중심으로 만들어져 있기 때문에 +Z 방향, 즉 마커 윗 방향으로 20 정도 이동시키면, 마커에 정확히 올려놓을 수 있습니다.

움직여 보기.

SimpleCube.fla 를 열고 퍼플리싱하면 웹 카메라로 부터 화면이 표시됩니다. 웹 카메라를 연결하지 않으면 에러가 발생합니다. 연결되어있는데도, 영상이 나타나지 않으면 우클릭 → 설정 → 카메라 아이콘 순서로 적당한 카메라를 선택해 주세요.(MacBook 이나, 내장 카메라는 USB Video Class Video 이라는 이름으로 되어 있습니다.)
인쇄된 마커 전체가 카메라에 비춰지도록 하면 오브젝트가 표시됩니다. 마커에 딱붙어 있네요. 어때요, 간단하죠?

정리

샘플을 보면 알 수 있듯, 마커를 따라 오브젝트를 움직이게 하는 것이라면 Papervision3D 으로 오브젝트를 만드는 코드를 작성하는 것 만으로 가능하기 때문에 모두 FLARToolKit를 시작해 봅시다.

Engineering Navi - ARToolKit 3. simpleTest.c 설명 (2/2)

 ** 이글은 http://kougaku-navi.net/ARToolKit.html 을 번역, 의역하였습니다.

 

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

 

 3-3. 메인루프 함수 mainLoop()

 

static void mainLoop(void)
{
    ARUint8         *dataPtr;      // 영상 데이터
    ARMarkerInfo    *marker_info;  // 검출된 마커의 정보
    int             marker_num;    // 검출된 마커의 수
    int             j, k;

    /* 카메라 영상 취득 */
    if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) {
        arUtilSleep(2);   // 영상이 찍히지 않았다면,  2밀리 세컨드를 기다려 함수를 벗어난다.

        return;
    }
    if( count == 0 ) arUtilTimerReset();  // 타이머 리셋
    count++;                              // 처리 프레임 수 카운트
                                          // ↑ 이것은 나중에 FPS를 계산할 때, 사용함

    /* 캡쳐한 영상 표시 */
    argDrawMode2D();
    argDispImage( dataPtr, 0,0 );

    /* 카메라 영상으로 부터 마커 검출 */
    if( arDetectMarker(dataPtr, thresh, &marker_info, &marker_num) < 0 ) {
        cleanup(); // 에러가 발생하면 종료처리를 해서 프로그램을 종료함
        exit(0);
    }

    arVideoCapNext();  // 다음 카메라 영상을 취득한다.

    /* 가장 일치도가 높은 마커를 찾는다. */
    k = -1;
    for( j = 0; j < marker_num; j++ ) {
        if( patt_id == marker_info[j].id ) {
            if( k == -1 ) k = j;
            else if( marker_info[k].cf < marker_info[j].cf ) k = j;
        }
    }
    /* 여기서, k번째 마커가 가장 일치도가 높은 마커가 된다. */

    if( k == -1 ) {        // 일치하는 마커를 찾지 못한다면,
        argSwapBuffers();  // 버퍼 내용을 화면에 따라 그리는 것만 한다.
        return;
    }

    /* 마커의 3차원 위치, 자세(마커, 카메라 간의 좌표 변환 행렬)을 구한다. */
    arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans);

    draw();  // 출력 처리(여기에서 3D 오브젝트의 출력을 하고 있다.)

    argSwapBuffers();  // 버퍼의 내용을 화면에 표시함
}

 

메인루프 함수는 종료처리가 실행될 때까지 계소해서 반복되어 실행됩니다. 마커의 검출을 실행하는

함수 arDetecMarker()는 검출된 마커의 식별ID와 꼭지점, 일치도 등의 정보를 포함한 구조체와

검출된 마커의 수를 반환하지만, 검출된 마커 중에서 가장 높은 일치도를 가진 모양을 찾는 처리는

스스로 코딩하지 않으면 안되는 것에 주의합시다. 여기에서,

 

   marker_info[j].id  // j번째에 검출된 마커에 대응하는 마커 ID
 marker_info[j].cf  // 거기에 얼마나 가까이에 있는지 표시하는 일치도(0.0~1.0의 수치)

 

로 됩니다.

 ARToolKit의 최대의 장치가 arTransMat()라는 함수입니다. 이 함수에는 검출된 마커의 정보에서 부터,

카메라의 시점에 대한 마커의 3차원 위치자세(위치자세라는 단어가 계속 나오는데, 적당한 한국말은

무엇일까요?)를 계산하고 있습니다. 수학적으로 꽤나 엄청난 일을 하고 있기 때문에, 흥미가 있는

분은 공식사이트에서 공개된 논문과 함께 프로그램의 소스를 확인하시는 것도 추천합니다.(꽤 공부가

되니까요.) 이 함수로 부터 얻어진 patt_trans가 좌표변환행렬입니다.

 

 

 

다음으로 이 메인 루프 함수 안에서 호출되고 있는 draw() 함수의 내부를 확인해 봅시다.

 

3-4. 그래픽 출력처리함수 draw()

 

static void draw( void )
{
    double    gl_para[16];
    GLfloat   mat_ambient[]     = {0.0, 0.0, 1.0, 1.0};
    GLfloat   mat_flash[]       = {0.0, 0.0, 1.0, 1.0};
    GLfloat   mat_flash_shiny[] = {50.0};
    GLfloat   light_position[]  = {100.0,-200.0,200.0,0.0};
    GLfloat   ambi[]            = {0.1, 0.1, 0.1, 0.1};
    GLfloat   lightZeroColor[]  = {0.9, 0.9, 0.9, 0.1};
   
    // 3D 공간을 그려내기 위한 설정.
    argDrawMode3D();
    argDraw3dCamera( 0, 0 );


    // 숨겨진 면 처리에 관한 기술
    glClearDepth( 1.0 );
    glClear(GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
   
    /* 좌표변환행렬 로드 */
    argConvGlpara(patt_trans, gl_para);
    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixd( gl_para );


    // 라이팅(조명)에 관한 기술
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambi);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

    // 실질적으로 3D 오브젝트를 만들기 위한 것은 이 3줄임!!
    glMatrixMode(GL_MODELVIEW);
    glTranslatef( 0.0, 0.0, 25.0 );  // 마커 위에 올리기 위해 z방면에 25.0mm 띄움
    glutSolidCube(50.0);             // 50.0mm의 정사각형을 그림

    glDisable( GL_LIGHTING );
    glDisable( GL_DEPTH_TEST );
}

  여기가 가장 프로그래머의 손길이 필요한 부분이라고 생각합니다. 이름이 'gl'로 시작하는 함수는 OpenGL

함수입니다. 위의 코드 중에 빨간 색으로된 부분에 주목해 주세요. argDrawMode3D()는 OpenGL의 모델
View 행렬을 초기화하는 함수입니다. argDraw3dCamera()는 3D 공간의 시야범위를 설정하는 함수입니다.

 우선 "3D공간을 출력하기 전에 이 2개를 호출한다"는 이해를 해주시기 바랍니다.

argConvGlpara()라는 함수는 조금 전에 구한 좌표변환행렬 patt_trans를 OpenGL형식(4X4 행렬의 1차원 배열)

으로 변환하고 있습니다.

 

 

 

< argConvGlpara()로 변환된 OpenGL 형식의 변환행렬 >

 

 최초, 원점(0,0,0)은 렌즈의 위치(= 카메라의 위치)에 있지만, glLoadMatrixd()에 따라 좌표변환이 실행되어,

이 함수 이후는 마커의 중심을 원점으로 하는 좌표계로의 작업이 됩니다. 최대 포인트는 OpenGL 위에 길이

단위를 미리미터 단위로 지정할 수 있는가 입니다! 예를 들어, 폭 50.0mm의 정사각형을 출력하고 싶다면,

 그대로 glutSolidCube(50.0) 라고 지정하면 되겠습니다. 다만, 이것을 실현하기 위해서는 마커의 크기가

확실히 설정되어 있어야 하므로, 주의해 주시기 바랍니다.

 

    double          patt_width     = 80.0// 마커의 한 변의 길이[mm]


 

※ patt_width는 소스 상부에 전역으로 선언되어 있습니다.

 

 ! ARToolKit의 그래픽 처리

 

   ARToolKit에 따르면, 카메라 영상을 표시하거나, 사영기하의 설정을 실행하는 처리계에는 'gsub'와

'gsub_lite'가 있습니다. 함수명 이름 앞이 'arg'로 시작하는 것이 gsub의 함수로, 'argl'로 시작하는 함수는

gsub_lite의  함수입니다.

 

- gsub의 함수 레퍼런스(영문))
- gsub_lite의 함수 레퍼런스(영문)

 

 gsub에는 GLUT에 따른 윈도우 처리, 콜백 함수 관리가 포함되어있지만, gsub_lite에는 포함되어 있지

않습니다. 단적으로 말하면, gsub_lite의 경우는 윈도우와 콜백 함수의 관리를 스스로 실장(実装:어떤

기능을 구현하기위해 구성요소를 구체화하는 일(구현하는 작업))하는 것이 가능해지지만, 이미 OpenGL/

GLUT에 익숙해진 독자분은 gsub_lite의 함수를 사용해 코딩하는 쪽이 적합할지도 모르겠습니다. 특히

기존의 OpenGL의 코드를 AR화 하려는 경우는 gsub_lite 함수로 코딩하는 쪽이 하기 쉽습니다.

 

 gsub을 사용하는 경우는 gsub.h를 include합니다. 한편, gsub_lite를 사용하는 경우는 gsub_lite.h를

include합니다. 여기서 설명하고 있는 simpleTest.c는 gsub를 이용하고 있습니다. gsub_lite를 사용한

샘플은 simpleLite.c 입니다. gsub_lite를 사용하는 프로그램 쪽이 느낌상(雰囲気的に:분위기적으로를 의역했

습니다.) OpenGL의 코드에 가깝습니다.(OpenGL의 코드 위에 ARToolKit의 코드를 실고 있는 듯한 느낌임.)

 

 gsub와 gsub_lite의 차이에 관한 내용은 공식 사이트인 아래 페이지에 설명이 있습니다. 요약하자면

"GLUT에 따른 처리가 들어있느냐, 아니냐"라고 해도 틀리지 않을 것 입니다.

 

- ARToolKit Documentation (ARToolKit Framework)

 

 3-5. 키 이벤트 함수 keyEvent()

 

static void   keyEvent( unsigned char key, int x, int y)
{
    /* ESC키가 눌리면 종료한다. */
    if( key == 0x1b ) {
        printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); // FPS 표시
        cleanup(); // 종료처리
        exit(0);
    }
}

 키 이벤트 함수는 프로그램의 초기화 시에 argMainLoop()에서 설정합니다. 그렇게 하면, 실행주에 키 입력이

있을 때에 이 함수가 호출되는 것이 가능해집니다.

 변수 key에는 눌러진 키의 키 코드가 들어가 있습니다. 이 프로그램에는 esc키가 입력되면, FPS를 표시하는

프로그램을 종료하도록 되어 있습니다. 변수 count에는 처리한 프레임 수가 들어가 있습니다. 이것을 시간(

arUtilTimer())에 나누면 1초당 처리 프레임 수(FPS)가 구해집니다.

 다음은 여기서 사용되는 cleanoup() 함수의 내부를 봅시다.

 

 3-6. 종료처리함수 cleanup()

 

 아주 심플합니다. "캡쳐를 멈추면 종료" 그것 뿐인가 봅니다. 프로그램의 처리 도중에 에러가 발생하는 경우는

이 함수를 실행한 후에 종료(exit(0) 한다)하도록 해주세요.

 

 이 샘플 프로그램의 구조가 이해된다면, 스스로 개인만의 AR 어플리케이션을 만들 수 있을 것 입니다.

 

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

 

 


Engineering Navi - ARToolKit 3. simpleTest.c 설명(1/2)

** 출처는 http://kougaku-navi.net/ARToolKit.html 입니다.

** 이글에 대한 모든 권리는 Sunao Hashimoto 씨에게 있습니다.

-------------------------------------------------------------------------------------------
지금까지의 정리.

 실질적인 프로그래밍에 들어가기 앞서, 지금까지 이야기를 정리해 둡시다.
 
 1. ARToolKit을 사용하면, 정사각형 마커를 카메라에 촬영하고 거기에 실시간으로 3D 오브젝트를 오버레이
 표시하는   프로그램을 제작가능하다.
 2. 사용하는 카메라를 직접 지정하기 위해서는 카메라 설정 파일(*.xml)을 옮겨 놓는다.
 3. 마커는 검은 정사각형의 굵은 테두리 중간에 흑백 또는 칼라 도안이 있는 것을 사용한다.
 4. 카메라 Calibration에는 calib_camera2.exe 를 사용한다.
 5. 패턴 파일 작성에는 mkpatt.exe 를 사용한다.

이제, 드디어 ARToolKit을 사용한 프로그래밍을 설명하겠습니다.

※ ARToolKit에 따른 프로그램 전체 구분.
 ARToolKit에 따른 프로그램 전체 모양은 아래 그림에 표시되어 있습니다. 하늘색으로 칠해진 부분이 하나의 
함수라고 생각해 주세요. 여러가지 처리해야 할 것이 나열되어 있어 아주 복잡해 보이기도 하지만, 프로그래머가
실제로 만들 부분은 노란색으로 표시되어 있는 부분 뿐 입니다
. 결국 대부분의 처리는 ARToolKit이 하고(= 그런 함수가
준비되어 있음) 있는 것입니다.

                                                          프로그래머는 노란색 부분만 제작하면 됩니다!

 구체적인 이야기를 하자면, main()함수 안에서 초기화 처리를 실행해, 메인 루프 함수를 동작시킵니다.
그 이후에 계속하여 메인 루프가 반복되어 집니다. 메인 루프 안에는 얻어낸 영상으로 부터 마커를 검출해,
마커를 3차원 위치자세(**의역하기 애매해서 그대로 두겠습니다.)를 계산하고, 마커의 원점으로 하는
좌표계에 변환한 후부터 3D 오브젝트를 그려냅니다. 메인 루프가 동작할 때는 키보드와 마우스의 입력을
받아낼 수 있습니다. 키 입력에 따라 종료 처리를 부르는 것이 일반적입니다.

 하얀색 박스 안에 표시된 처리는 대부분 약속된 처리이기 때문에 샘플 코드 등에서 그대로 사용할 수 있습니다.
프로그래머가 제작해야만 하는 메인 부분은 "어떤 마커가 왔을 때, 어떤 모델을 어떤 식으로 나타낼 것인가?"
라는 부분입니다.  여기에서 중요한 것이, ARToolKit에서의 3D 그래픽 처리에는 'OpenGL'을 사용한다
점입니다. 즉, 3D 오브젝트을 그려내는 것과 조작에는 OpenGL의 지식이 필요합니다. 기초적인 지식이 있다면, 
입방체(정육면체)를 나타내거나, 구체를 나타내거나 하는 정도는 바로 제작할 수 있습니다. OpenGL로 게임을
제작한 경험이 있는 분은 점점 깊이 빠져, 재미있는 것을 만들어 낼 수 있을 것 입니다. "OpenGL라는 건 처음
인데..." 라는 분은 꼭 이번 기회에 공부해 보시길 바랍니다.


 3. 샘플 프로그램 simpleTest.c를 확인해 보자.
  ARToolKit 폴더 안에 들어있는 샘플 프로그램의 소스코드를 확인하고, 프로그래밍 방법을 공부합시다.
 여기에서,
 
          C:\Program Files\ARToolKit\examples\simple
 
 이 폴더 중에 있는 simpleTest.c를 사용해 설명하겠습니다. 이 프로그램이 이해되면, 스스로 ARToolKit을
사용한 프로그램을 만들 수 있게 됩니다.

 3-1. 메인 함수 main()
int main(int argc, char **argv)
{
    glutInit(&argc, argv); // GLUTの初期化
    init();                // 初期化関数の実行

    arVideoCapStart();     // ビデオキャプチャの開始
    argMainLoop( NULL, keyEvent, mainLoop );   // メインループに入る
    return (0);
}
**GLUTの初期化  : GLUT 초기화
**初期化関数の実行  :  초기화 함수의 실행
**ビデオキャプチャの開始  : 비디오 캡쳐의 개시
**メインループに入る  : 메인 루프로 들어감

  메인 함수 안에 써있는 것은 주로 초기화 처리와 메인루프의 실행입니다. 메인루프의 실행은 argMainLoop()에
따라 실행할 수 있습니다. 제 1 인수는 마우스 이벤트 함수, 제 2인수에 키 이벤트 함수, 제 3인수에 메인루프
함수를 지정합니다. 이 프로그램에서는 마우스 이벤트 함수를 지정하지 않았으므로, NULL 입니다. 메인루프에
들어가면 더이상 메인함수에는 돌아오지 않습니다. 다음은 여기에 사용되고 있는 INIT() 함수의 내부를 봅시다.

  3-2. 초기화 함수 init()

static void init( void )
{
    ARParam  wparam;
	
    /* ビデオデバイスの設定 */
    if( arVideoOpen( vconf ) < 0 ) exit(0);  // カメラ設定ファイルをロード
    /* ウィンドウのサイズの取得 */
    if( arVideoInqSize(&xsize, &ysize) < 0 ) exit(0);
    printf("Image size (x,y) = (%d,%d)\n", xsize, ysize);

    /* カメラパラメータの初期化 */
    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);
    }

    /* グラフィックウィンドウを開く */
    argInit( &cparam, 1.0, 0, 0, 0, 0 );
}
**   /* ビデオデバイスの設定 */ : 비디오 디바이스 설정
**   /* ウィンドウのサイズの取得 */ : 윈도우 사이즈 취득
**   /* カメラパラメータの初期化 */ : 카메라 파라미터 초기화
**  // カメラパラメータファイルをロード : 카메라 파라미터 파일을 로드
**  // 解像度にあわせてパラメータを変更 : 해상도에 맞춰 파라미터를 변경
**  // カメラパラメータの設定 : 카메라 파라미터 설정
**  // カメラパラメータの表示 : 카메라 파라미터 표시
**  // パターンファイルをロードする : 패턴 파일을 로드한다.
**  /* グラフィックウィンドウを開く */ : 그래픽 윈도우를 연다.


 함수 이름 앞이 'ar'로 시작하는 ARToolKit 함수가 많이 있습니다.
여기에서 실행하고 있는 것은 아래의 4가지 입니다.
  1. 비디오 디바이스 설정(설정이 기록된 XML 파일을 읽어들임)
  2. 카메라 파라미터를 로드, 해상도에 맞춰 변경하고 설정함.
  3. 패턴 파일을 읽어들임.
  4. 윈도우 작성

 복수의 카메라를 사용하는 경우와 복수의 마커를 사용하는 경우에는 조금 변경이
필요하지만, 하나의 카메라에 하나의 마커를 이용하는 간단한 어플리케이션을 제작할
경우는 이대로 사용하실 수 있습니다. 3D 오브젝트의 로드 등에는 이 함수 안에
추가하셔도 좋습니다.

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

Enginneering Navi - ARToolkit 2 마커제작


2. 스스로 마커를 만들어 보자.
 ARToolKit으로 만들어진 프로그램은 마커의 패턴정보를 기록한 파일(이하 패턴 파일이라 부른다.)을 실행시,
로드하고 있습니다.
 예를 들면, 샘플 프로그램의 simpleLite.exe는 마커 인식에 C:\Program Files\ARToolKit\bin\Data 중에
있는 patt.hiro를 사용하고 있는데, 이 파일은 스스로가 만들 수가 있는데, 여기서는 그 순서에 대해 해설합니다.

2-1. 패턴을 디자인한다.
 ARToolKit의 마커는 검정색 정사각형의 굵은 테두리 안에 흑백, 또는 컬러의 도안이 있는 것을 사용합니다.
이 조건만 만족시킨다면, 스스로 임의의 패턴을 작성하는 것이 가능합니다. 다만, 컬러 도안은 카메라와
프린터의 색 재현성이 인식성능의 영향을 미치기 때문에, 주의해 주시기 바랍니다. 패턴은 임의의 포토샵과
같은 페인트 소프트웨어로 그립니다. 인쇄하고 사용하기 때문에 형식은 상관없습니다.
또한 종이에 펜으로 직접 그려 디자인 한것도 괜찮습니다.


윈도우 기본 제공의 그림판으로도 패턴을 그릴 수 있습니다.
중간에 그려야 할 패턴은 문자로 하는 것을 추천합니다.

마커의 검은 테두리 굵기에 대하여..

 이 기사를 공개한 이후로 꽤 시간이 흘러 알게된 내용입니다. ARToolKit의 마커
패턴은 검은 테두리 부분과 코드 부분의 크기로 암묵적인 조건이 있는 것 같습니
다. (정보의 출처는 개발자 본인임)
 소스코드 위에는 ' 검은 테두리 : 백색 코드 영역 : 검은테두리 '의 비율이
' 1 : 2 : 1 '가 되는 것이 전제되어 있습니다. 코드 인식처리의 부분에서 그 조건을
전제로 코드 영역을 정규화해 인식하기 때문에, 이 조건으로부터 극단적으로 먼
디자인이 된다면 인식이 잘 되지 않을 가능성이 있습니다.(덧붙여 사각형 추출
처리는 관계없음) 공식적으로는 '기본적으로 제공하는 빈 사각형 마커(ARToolKit\patterns\blankPatt.gif)를 베이스로 만드세요.' 라고 되어있는 듯
합니다. 물론 이 조건에서 벗어나면, 느닷없이 밖으로 나간다는  법은 없지만,
정확도라는 점에서 생각해보면 되도록 이 암묵적인 룰을 따르도록 합시다.


2-2. 패턴 파일 작성툴의 사용 방법.
 ARToolKit 폴더 안에 들어있는 패턴 파일 작성툴은 훌륭합니다. 카메라로 직접 촬영하여 패턴 파일을
작성할 수 있습니다. 영상 파일의 형식은 관계없이, 손으로 그린 패턴이라도 만들 수 있는 것은 이 때문
 입니다. 패턴 파일 작성 툴은 아래의 프로그램입니다.

  C:\Program Files\ARToolKit\bin\mkpatt.exe

 2-2-1. mkpatt.exe를 실행하면 아래와 같은 메세지가 표시됩니다.
 
  Enter camera parameter filename(Data/camera_para.dat): 

  
  여기에 사용하는 카메라 파라미터 파일을 입력합니다. 이대로 엔터를 누르면 디폴트인
'Data/camera_para.dat'가 선택됩니다.

 2-2-2. 비디오 캡쳐 설정 다이얼로그가 표시되면, 'OK'를 누릅니다. 그러면 영상 윈도우가 표시됩니다.
 
 2-2-3. 카메라로 물체를 촬영하는 동안에 화면 내에 패턴 조건을 만족하는 직사각형(구형)영역이 있다면,
 빨간색과 녹색 선으로 에워싸게 됩니다.


 디스플레이에 표시되고 있는 패턴을 카메라로 촬영하고 있는 장면
(작성된 패턴이 적색과 녹색 선으로 둘러싸고 있습니다.)

 스스로 제작한 패턴을 종이에 인쇄하던지, PC의 디스플레이 상에 표시하던지 하여, 그 패턴을 카메라로 촬영합니다.
패턴의 좌측 상단 모서리가 빨간색, 우측 하단 모서리가 녹색선으로 에워싸고 있는 상태에서 화면 상에서 좌클릭합니다.

 2-2-4. 클릭하면, 영상이 정지하고, 아래의 메세지가 표시됩니다. 임의의 파일명(예로 patt.kougaku)를 입력합니다.

Enter filename: 

이것으로 패턴 파일이 작성되었습니다. 파일은 'C:\Program Files\ARToolKit\bin'의 폴더 안에 저장됩니다.
 샘플 프로그래밍인 simpleLite.exe는 'C:\Program Files\ARToolKit\bin\Data'의 폴더 안에 있는'patt.hiro'
를 사용하여 패턴인식을 하고 있습니다. 이 파일에 현재 작성한 파일을 덮어쓰기하면, 자신이 만든 마커가 확실히
인식되는지 확인할 수 있습니다.
 

Engineering Navi - ARToolkit 프로그래밍 1 - Camera Calibration.

 
** 이 글은 http://kougaku-navi.net/ARToolKit.html 의 기초 프로그래밍 부분을 해석한 것 입니다.

** 저처럼 ARToolKit에 막 입문하신 분들께 조금이나마 도움을 줄 수 있을 것 같아, 해석하게 되었습니다

** 글을 쓰신 Sunao Hashimoto 씨의 동의를 얻지 않고 해석한 점 죄송하게 생각합니다.

    (スナオ・ハシモト様、勝手に翻訳することになって本当に申し訳ございません。もし、問題になれば、
   消しますのでsega_kr@hotmail.comにご連絡してください。ありがとうございます。) 

** 처음 설치부분은 생략합니다. 예제 파일이 이상없이 돌아간 이후에 글을 참고해 주시기 바랍니다.
     (ARtoolkit이 들어있는 폴더는  Program File 폴더 내에 세팅하였음.)

 ** 이 글을 쓴 분은 로지텍 퀵 캠 For Notebook Pro를 사용했습니다.

 ** 자연스러운 표현을 위해, 의역하였습니다.




1. Camera Calibration을 해봅시다.


 1-1. Camera Calibration 라는 것은 무엇인가?
   사용하는 카메라에 따라, 초점 거리와 렌즈의 일그러짐 등 특성이 달라집니다. 이런 카메라의 특성값
(카메라 파라미터)는 영상으로 부터 마커의 3차원 위치상태를 구하는 계산과 3D 오브젝트를 정확하게
처리하는데 영향을 미치게 됩니다. 보다 정확한 계측을 하기 위해서는 사전에 카메라 파라미터를 구하는
작업
, 즉 Camera Calibration이 필요하게 됩니다.

 공식사이트(영문)에는 2가지 방법의 Calibration방법에 관하여 해설이 있습니다.
  ARToolKit Documentation - Camera Calibration 

  - 1. 1 Step Calibration(간단함)
   영상을 중첩시켜 표시한 다음 충분한 정확도를 얻어낼 수 있는 방법.
 
  - 2. 2 Step Calibration(복잡함)
    보다 높은 정밀도를 가진 결과를 얻어낼 수 있는 방법.(3차원 계측 방면)

여기에서는 간단한 방법인 '1 Step Calibration'에 대해 해설하겠습니다.

1-2. Calibration용 패턴을 인쇄한다.
   일반적인 Camera Calibration으로는 격자 모양과 등간격 점을 인쇄한 종이(Calibration 보드)를
사용합니다. 
이것을 카메라에 촬영하고, 영상 안에 격자모양의 점의 위치를 기록한 뒤, 약간의 계산을
실행함으로 카메라 
파라미터를 산출하는 것이 가능합니다. ARToolKit에는 그 Calibration용 패턴과
계산 툴이 들어가 있습니다.
  Calibration에서 사용하는 패턴은 아래의 PDF 파일 입니다.

 -> C:\Program Files\ARToolKit\patterns\calib_dist.pdf
     
  이 PDF 파일을 인쇄해 주세요.(프린트가 없다면, PC의 모니터에 패턴을 표시하는 것도 좋은 방법입니다.)

            Calibration용 패턴(calib_dist.pdf)

 인쇄한 점과 점사이의 길이(점의 중심에서의 길이)를 자로 측정해 주십시요. 이 때, 미리미터 단위로
측정하는
것에 주의하시기 바랍니다. A4의 종이에 인쇄를 한 경우에는 38mm~40mm정도가 될 것 입니다.
 이 수치는
다음에 사용하게 됩니다.

1-3. Calibration의 사용 방법.
  이제부터 Calibration을 사용해 봅시다. 1 Step Calibration에서는 아래의 프로그램을 사용했습니다.

 -> C:\Program Files\ARToolKit\bin\calib_camera2.exe
 
 1-3-1. calib_camera2.exe 파일을 더블 클릭하면, 아래와 같이 표시됩니다.

-> Input the distance between each marker dot, in millimeters:
  
 점과 점 사이의 거리를 미리미터 단위로 입력해 달라는 말이기 때문에, 여기에서는 방금전 자로 측정했던
길이를 입력하고 엔터를 눌러 주십시요. 그렇게 하면, 비디오 캡쳐 설정 다이얼로그가  표시되기 때문에
그대로 OK를 눌러 주세요.(※해상도를 변경하고 있은 경우는 '출력 사이즈'의 항목을 변경하세요.)

 값을 입력하면 이렇게 표시되어, 영상 윈도우가 표시됩니다.
Input the distance between each marker dot, in millimeters: 38
Camera image size (x,y) = (320,240)

-----------
Press mouse button to grab first image,
or press right mouse button or [esc] to quit.
argl error: Your OpenGL implementation and/or hardware's texturing capabilities
are insufficient to support rectangle textures.


  1-3-2. 다음은 4 X 6 개의 모든 점이 화면 안에 들어가도록 촬영를 하고, 그 상태로 화면에 1회 좌클릭
합시다. 이 때, Calibration용 패턴은 꼭 평평한 장소에 두시기 바랍니다.

  1-3-3 클릭하면, 화면이 정지하고 특징점 기록 모드에 들어갑니다.

-----------
Press mouse button and drag mouse to rubber-bound features (6 x 4),
or press right mouse button or [esc] to cancel rubber-bounding & retry grabbing.

"마우스 버튼을 눌러 드래그하고 6 X 4 개(총 24개)의 특징점을 선택하여 주십시요. 우클릭 또는 ESC키로
작업을 캔슬하고, 영상을 다시 찍을 수 있게 됩니다."
라는 의미의 메세지가 표시됩니다. 마우스의 드래그 조작으로 검은 점 한개 한개의 범위을 선택해 나갑니다.
범위 선택을 하고 있는 영역은 monochrome(흑백)으로 표시됩니다. 드래그하고 마우스 버튼을 떼면,
범위 내에 있는 점의 중심에 빨간 십자선이 표시됩니다. 표시된 24개의 모든 점에 이 작업을 합시다.
클릭하는 순서는 정해져 있기 때문에 주의하시기 바랍니다.
하단의 그림에서 청색 문자에 적혀있는 숫자가 클릭하는 순서입니다.  


좌클릭을 하면 화면이 정지합니다.

순서대로 점의 중심을 기록합시다.

  작업 중에는 이렇게 표시됩니다.

 
Marked feature position 1 of 24
Marked feature position 2 of 24
Marked feature position 3 of 24
Marked feature position 4 of 24
Marked feature position 5 of 24

                      .

                      .

                      .


 1-3-4. 모든 점에 대한 작업이 끝나게 되면 아래와 같이 표시됩니다.
"좌클릭으로 특징점을 보존합니다. 우클릭 또는 ESC키로 화면을 다시 찍습니다."
라는 의미이므로, 확실히 점을 찍었다면 한번 더 화면을 좌클릭 합니다.
Marked feature position 24 of 24
-----------
Press mouse button to save feature positions,or press right mouse button or [esc] to discard feature positions & retry grabbing.

 1-3-5. 좌클릭하면, 조금 전에 작업으로 지정한 점의 좌표값이 표시되어 영상의 정지상태가 해제됩니다.
화면에는 "좌클릭으로 다음 영상을 *얻어냅니다.('取り込みます: 거둬 들입니다. 수확합니다'의 의역인데,
뜻이 틀릴지도 모르겠네요.) 우클릭 또는 ESC키로 일그러진(뒤틀린) 상태의 파라미터를 구할 수 있습니다."
라고 나와있지만, Calibration에는 2장 이상의 영상을 필요로 하고 있기 때문에, 여기서 한번 더
1-3-2 ~ 1-3-4의 작업을 반복합니다.
  

-----------
Press mouse button to grab next image,or press right mouse button or [esc] to calculate distortion parameter.

 1-3-6. 두번째 특징점 클릭이 끝나면 화면을 우클릭합니다. 그러면 계산이 실행된 이후, 아래의 메세지와
함께, 점 사이를 빨간색으로 이은 영상이 표시됩니다.
-----------
Checking fit on image 1 of 2.Press mouse button to check fit of next image.
 이 그림과 같이, 대각선과 격자점이 확실하게 교차하고 있는 영상이 표시된다면, OK~.
영상을 좌클릭하면 다음 영상이 표시됩니다.
-----------
Checking fit on image   2 of   2.
Press mouse button to calculate parameter.


 2번째 작업한 영상에서도 대각선과 격자선이 정확히 표시되는 것을 확인할 수 있다면, 영상을 좌클릭합니다.

 1-3-7. 계산이 실행된 이후, 아래의 메세지가 표시된다면 성공입니다.
 "Calibration은 성공했습니다. 파일명을 입력해서 카메라 파라미터를 보존해 주세요"라는 뜻이므로,
 적당한 파일명을(예를 들어, my_camera_para.dat)를 입력하고, 엔터를 누릅니다.
Calibration succeeded. Enter filename to save camera parameter to below.
--------------------------------------
SIZE = 320, 240Distortion factor = 105.000000 81.500000 -30.700000 0.986381750.89434 0.00000 155.00000 0.000000.00000 1999.36684 32.50000 0.000000.00000 0.00000 1.00000 0.00000
--------------------------------------
Filename:

 1-3-8. 카메라 파라미터 파일은 C:\Program Files\ARToolKit\bin 안에 생성됩니다.
 이것으로 Calibration은 종료입니다.

 샘플 프로그램을 이용하고 있는 디폴트 카메라 파라미터 파일은 아래의 폴더의 파일입니다.

 C:\Program Files\ARToolKit\bin\Data\camera_para.dat

 이 파일과 현재 자신이 만든 파일을 옮겨놓으면, 현재 쓰고 있는 개인 카메라로 높은 정밀도를 가진
오버레이 표시가 가능합니다.
===========================================================

 
◀ PREV 1 NEXT ▶