最終更新: pafuhana1213 2011年07月02日(土) 21:57:29履歴
※前準備
・ARToolKit・GLUTのインクルード・ライブラリディレクトリ指定
・"ARToolKit\bin\Data"をカレントディレクトリに移動
・ARToolKit・GLUTのインクルード・ライブラリディレクトリ指定
・"ARToolKit\bin\Data"をカレントディレクトリに移動
/* インクルード */ #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <GL/glut.h> //OpenGL(GLUT) #include <AR/ar.h> //基本関数 #include <AR/param.h> //パラメータ管理 #include <AR/video.h> //ビデオ処理 #include <AR/gsub.h> //グラフィック処理 /* ライブラリ */ #ifdef _DEBUG #pragma comment( lib, "libARd.lib" ) #pragma comment( lib, "libARgsubd.lib" ) #pragma comment( lib, "libARvideod.lib" ) #pragma comment( lib, "opengl32.lib" ) #pragma comment( lib, "glu32.lib" ) #pragma comment( lib, "glut32.lib" ) #else #pragma comment( lib, "libAR.lib" ) #pragma comment( lib, "libARgsub.lib" ) #pragma comment( lib, "libARvideo.lib" ) #pragma comment( lib, "opengl32.lib" ) #pragma comment( lib, "glu32.lib" ) #pragma comment( lib, "glut32.lib" ) #endif /* グローバル変数 */ char* vconf = "Data\\WDM_camera_flipV.xml"; int xsize, ysize; int thresh = 100; int count = 0; char* cparam_name = "Data/camera_para.dat"; ARParam cparam; char* patt_name = "Data/patt.hiro"; int patt_id; double patt_width = 80.0; double patt_center[2] = {0.0, 0.0}; double patt_trans[3][4];
void CleanUp(void) { arVideoCapStop(); // キャプチャのストップ arVideoClose(); // ビデオデバイスを閉じる argCleanup(); // ARToolKitの終了処理 }
void KeyEvent( unsigned char key, int x, int y) { /* ESCキーが押されたら終了する */ if( key == 0x1b ) { CleanUp(); // 終了処理 exit(0); } }
void Draw(void) { double gl_para[16]; /* 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 ); /* 3Dオブジェクト描画 */ glMatrixMode(GL_MODELVIEW); glTranslatef( 0.0, 0.0, 25.0 ); glutSolidCube(50.0); glDisable( GL_DEPTH_TEST ); }
void MainLoop(void) { ARUint8 *dataPtr; // 画像データ ARMarkerInfo *marker_info; // 検出されたマーカの情報 int marker_num; // 検出されたマーカの数 int j, k; /* カメラ画像の取得 */ if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) { arUtilSleep(2); // 画像が取れなかったら2ミリ秒待って関数を出る return; } /* キャプチャ画像の表示 */ 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; } } if( k != -1 ) { /* マーカの3次元位置・姿勢(マーカ・カメラ間の座標変換行列)の計算 */ arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans); Draw(); // 描画処理 } argSwapBuffers(); // バッファの内容を画面に表示 }
void InitAR( 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("カメラパラメータの読み込みに失敗しました\n"); exit(0); } arParamChangeSize( &wparam, xsize, ysize, &cparam ); // 解像度にあわせてパラメータを変更 arInitCparam( &cparam ); // カメラパラメータの設定 printf("*** Camera Parameter ***\n"); arParamDisp( &cparam ); // カメラパラメータの表示 if( (patt_id=arLoadPatt(patt_name)) < 0 ) { // パターンファイルをロードする printf("パターンファイルの読み込みに失敗しました\n"); exit(0); } /* グラフィックウィンドウを開く */ argInit( &cparam, 1.0, 0, 0, 0, 0 ); }
このページへのコメント
BPbfEi A round of applause for your blog.Thanks Again. Great.
QOKQvM Great, thanks for sharing this blog. Awesome.
PDH9GE <a href="http://dhrthxsbcbll.com/">dhrthxsbcbll</a>, [url=http://monabexximoj.com/]monabexximoj[/url], [link=http://fdbpgjmildyt.com/]fdbpgjmildyt[/link], http://tzueeivyunsw.com/
k9yyt8 <a href="http://wzvrxwghkprs.com/">wzvrxwghkprs</a>, [url=http://oqfyfeeuadhb.com/]oqfyfeeuadhb[/url], [link=http://jvbptgthzqzb.com/]jvbptgthzqzb[/link], http://kjanrhpyiyga.com/