プログラミングに関する私的メモ(現在:OpenGL・OpenCV・ARToolKit・Kinect・Unity)

※前準備
・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();  // バッファの内容を画面に表示
}

/* ARToolKit初期化関数 */

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 );
}

/* メイン関数 */

int main( int argc, char **argv)
{
	glutInit( &argc, argv ); // GLUTの初期化
	InitAR();                // ARToolKitの初期化

	arVideoCapStart();     // ビデオキャプチャの開始
	argMainLoop( NULL, KeyEvent, MainLoop );   // メインループ
	return 0;
}

このページへのコメント

BPbfEi A round of applause for your blog.Thanks Again. Great.

0
Posted by awesome things! 2013年12月31日(火) 16:15:08 返信

QOKQvM Great, thanks for sharing this blog. Awesome.

0
Posted by watch for this 2013年12月20日(金) 01:32:58 返信

PDH9GE <a href="http://dhrthxsbcbll.com/">dhrthxsbcbll</a>, [url=http://monabexximoj.com/]monabexximoj[/url], [link=http://fdbpgjmildyt.com/]fdbpgjmildyt[/link], http://tzueeivyunsw.com/

0
Posted by staujenk 2013年11月20日(水) 19:56:46 返信

k9yyt8 <a href="http://wzvrxwghkprs.com/">wzvrxwghkprs</a>, [url=http://oqfyfeeuadhb.com/]oqfyfeeuadhb[/url], [link=http://jvbptgthzqzb.com/]jvbptgthzqzb[/link], http://kjanrhpyiyga.com/

0
Posted by eqqclns 2013年11月14日(木) 23:39:49 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます