約 6,283,007 件
https://w.atwiki.jp/artoolkit/pages/14.html
ARToolKitまとめ 基本 導入 メタセコ 応用 指AR
https://w.atwiki.jp/mikmik/pages/17.html
電脳ワールドへようこそ ニコニコ見ててARToolKit見つけました。 (電脳て、久しぶりに使う言葉だ 電脳Google Earth http //www.nicovideo.jp/watch/sm1847562 http //www.nicovideo.jp/watch/sm1847562 電脳仮面 http //www.nicovideo.jp/watch/sm1905156 http //www.nicovideo.jp/watch/sm1905156 電脳フィギュア http //www.nicovideo.jp/watch/sm1821275 http //www.nicovideo.jp/watch/sm1821275 ちょwww違う。 ARToolKit http //www.hitl.washington.edu/artoolkit/ 工学ナビ http //www1.bbiq.jp/kougaku/index.html http //www1.bbiq.jp/kougaku/ARToolKit.html Tag ArToolKit http //www.nicovideo.jp/tag/ARToolKit いぁ、TVとかでやってたから、あるのは知ってたんですが、Webカメラ買ったので試してみたんです。 調べててわかったのは、かなり昔からあるものですが、まだまだ発展途上ということです。 ビジュアルマーカー認識と、それを元に映像を出す機能があるのですが、 表示する映像の指定や動き等は、プログラム書き換えて勝手にしろやゴルァってことです。 ToolKitなので仕方ないです。 PCの性能もずいぶん良くなってるし、VOCALOIDが3D化してたりするし、流行るかも・・・。
https://w.atwiki.jp/dendenkeroro/pages/51.html
拡張現実、ARToolkitを使いこなしてロボットに実装しよう! はい、欲張りですねぇー。自滅しない程度に広く浅くやっていきます。 使えるものは全部コピペだ! USBカメラでリアルタイムに画像解析、及び3Dでオブジェクト表示をしようと思ったらこれ、ARToolKitですね。 導入編 細かいことは参照ページに記載されているので、そちらをどうぞ。↓画像をクリック! Copyright (C) Sunao Hashimoto. All Rights Reserved. こちらも参考図書として紹介しておきます。 設定編 実際にプログラムしていて間もないですが(2010年5月3日現在)、行き詰ったところを以下にリストにしておきます。 OpenGLを参考書通りに設定したけど、ビルドした時にリンカエラーが出る! 参考書のP82~P83あたりを熟読しましたか? msvcp71d.dllが見つかりませんとエラーが出るのですが・・・ どうやらDSVLのコンパイル時に正常に作られなかったようですね。 Googleで検索するとだるんロードできますので、それをARToolkitフォルダ下のbinフォルダに入れてやってください。 それでもだめならプロジェクトフォルダに直接ぶちこんでもいいでしょう。 プログラム「ゲームパッドを使おう!」 とりあえずこれ↓でゲームパッド使えます。タグは各自用意で書き換えてください。 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable 4819) windows.h stdio.h stdlib.h GL\gl.h GL\glut.h AR\gsub.h AR\video.h AR\param.h AR\ar.h /* カメラ構成 */ char*vconf = "C /ARToolKit/bin/Data/WDM_camera_flipV.xml";// 既定のカメラ構成 intxsize;// ウィンドウサイズ intysize;// ウィンドウサイズ intthresh = 100;// 閾値 intcount = 0;// 処理フレーム数 /* カメラパラメータ */ char*cparam_name = "C /ARToolKit/bin/Data/502_camera_para.dat";// 既定のカメラパラメータ ARParamcparam;// カメラパラメータ /* パターンファイル */ char*patt_name= "C /ARToolKit/bin/Data/JinjaMark.hiro";// パターンファイル名 intpatt_id;// パターンID doublepatt_width= 80.0;// パターンの幅(mm単位) doublepatt_center[2]= {0.0, 0.0};// パターンの中心 doublepatt_trans[3][4];// 座標変換行列 /* オブジェクトの移動量 */ extern floatexTx = 0.0;// x軸方向の移動量 extern floatexTy = 0.0;// y軸方向の移動量 static void init(void); static void mainLoop(void); static void draw(void); static void setupLighting(void); static void setupMaterial(void); static void cleanup(void); static void keyEvent(unsigned char key, int x, int y); void joystick(unsigned int ButtonMask, int x, int y, int z); void idle(void); int main(int argc, char **argv) { /* GLUTの初期化 */ glutInit( argc, argv); glutIdleFunc(idle); /* ARアプリケーションの初期化*/ init(); glutJoystickFunc(joystick, 10); glutForceJoystickFunc(); /* キャプチャ開始 */ arVideoCapStart(); /* メインループの呼び出し */ argMainLoop( NULL, keyEvent, mainLoop ); return (0); } 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); } /* gsubライブラリの初期化 */ argInit( cparam, 1.0, 0, 0, 0, 0 ); } static void mainLoop(void) { ARUint8*dataPtr;// カメラ画像 ARMarkerInfo*marker_info;// マーカー検出用の情報 intmarker_num;// マーカーらしき部分の個数 intj, k;// ループカウンタ /* カメラ画像の取得 */ if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) { arUtilSleep(2); return; } if( count == 0 ) arUtilTimerReset(); count++; /* キャプチャした画像の表示 */ 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 ) { argSwapBuffers(); // 移動量を初期化 exTx = 0.0; exTy = 0.0; return; } /* 座標変換行列を取得 */ arGetTransMat( marker_info[k], patt_center, patt_width, patt_trans); /* 3次元オブジェクトの描画処理 */ draw(); /* バッファの内容を出力 */ argSwapBuffers(); } static void draw( void ) { doublegl_para[16];// ARToolkit- OpenGL変換行列 /* 3次元オブジェクトの描画準備 */ argDrawMode3D(); argDraw3dCamera(0, 0); /* 隠面消去 */ glClearDepth(1.0);// デプス・バッファの消去値 glClear(GL_DEPTH_BUFFER_BIT);// デプス・バッファの初期化 glEnable(GL_DEPTH_TEST);// 隠面消去・有効 glDepthFunc(GL_LEQUAL);// デプス・テスト /* 座標変換行列の読み込み */ argConvGlpara(patt_trans, gl_para);// ARToolkit - OpenGL glMatrixMode(GL_MODELVIEW);// 行列変換モード・モデルビュー glLoadMatrixd(gl_para);// 読み込む行列を指定 /* ライティング */ setupLighting();// ライトの定義 glEnable(GL_LIGHTING);// ライティング・有効 glEnable(GL_LIGHT0);// ライト0・オン glEnable(GL_LIGHT1);// ライト1・オン /* オブジェクトの材質 */ setupMaterial(); /* 3次元オブジェクトの描画 */ glTranslatef(exTx, exTy, 25.0);// オブジェクトの平行移動 glutSolidCube(50.0);// ソリッドキューブを描画(1辺のサイズ50mm) /* 終了処理 */ glDisable(GL_LIGHTING);// ライティング・無効 glDisable(GL_DEPTH_TEST);// デプス・テスト・無効 } static void setupLighting(void) { /* ライトの定義 */ GLfloatlt0_position[] = {100.0, -200.0, 200.0, 0.0};// ライト0の位置 GLfloatlt0_ambient[] = {0.1, 0.1, 0.1, 1.0};// 環境光 GLfloatlt0_diffuse[] = {0.8, 0.8, 0.8, 1.0};// 拡散光 // GLfloatlt1_position[] = {-100.0, 200.0, 200.0, 0.0};// ライト1の位置 GLfloatlt1_ambient[] = {0.1, 0.1, 0.1, 1.0};// 環境光 GLfloatlt1_diffuse[] = {0.8, 0.8, 0.8, 1.0};// 拡散光 /* ライトの設定 */ glLightfv(GL_LIGHT0, GL_POSITION, lt0_position); glLightfv(GL_LIGHT0, GL_AMBIENT, lt0_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, lt0_diffuse); // glLightfv(GL_LIGHT1, GL_POSITION, lt1_position); glLightfv(GL_LIGHT1, GL_AMBIENT, lt1_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, lt1_diffuse); } static void setupMaterial(void) { /* オブジェクトの材質 */ GLfloatmat_ambient[] = {0.0, 0.0, 1.0, 1.0};// 材質の環境光 GLfloatmat_specular[] = {0.0, 0.0, 1.0, 1.0};// 鏡面光 GLfloatmat_shininess[] = {50.0};// 鏡面係数 // glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); } static void cleanup(void) { /* 終了処理 */ arVideoCapStop();// キャプチャを停止 arVideoClose();// ビデオデバイスを終了 argCleanup();// ARToolkitの終了処理 } static void keyEvent( unsigned char key, int x, int y) { switch (key){ /* ESCキーで終了 */ case 0x1b printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); cleanup(); exit(0); /* H, h:x軸の-方向に移動 */ case H case h exTx = exTx - 5.0; break; /* L, l :x軸の+方向に移動 */ case L case l exTx = exTx + 5.0; break; /* J, j :y軸の+方向に移動 */ case J case j exTy = exTy + 5.0; break; /* K, k :y軸の-方向に移動 */ case K case k exTy = exTy - 5.0; break; default break; } } void joystick(unsigned int ButtonMask, int x, int y, int z) { if(10 x) printf("右"),exTy = exTy - 5.0; if(x -10) printf("左"),exTy = exTy + 5.0; if(10 y) printf("上"),exTx = exTx - 5.0; if(y -10) printf("下"),exTx = exTx + 5.0; if(ButtonMask 1) printf("△"); if(ButtonMask 2) printf("○"); if(ButtonMask 4) printf("×"); if(ButtonMask 8) printf("□"); if(ButtonMask 16) printf("L2"); if(ButtonMask 32) printf("R2"); if(ButtonMask 64) printf("L1"); if(ButtonMask 128) printf("R1"); if(ButtonMask 256) printf("START"); if(ButtonMask 512) printf("SELECT"); glutPostRedisplay();/* 画面再描画 */ } void idle(void) { glutForceJoystickFunc();/* これを追加 */ } 今後のプログラム予定 タグのトラッキング(ロボットのヘッドで追従・未検出時は探索もしくはニュートラル) ロックオン、シューティング的な何かw
https://w.atwiki.jp/rupt/pages/134.html
ARToolKit時計 ../ ソフトウェア名 ARToolKit時計 現Version 0.1 作者(敬称略) たろサ 配布元 転載中 らぴゅーとぴあウェブ転載所 ソフトウェア形態 フリー ソース 公開/C 紹介 AR用のマーカをRuputer上に表示する。時計機能あり。 ARとは簡単に言うと 撮影中の映像にリアルタイムで3Dモデル等を合成する技術のことである。 このソフトが表示する黒い枠は、その合成の際に必要なマーク。 これをRuputerで表示すると何故嬉しいかといえば、 腕につけたRuputerの上でマスコットが踊っている姿を見ることができたりするからである。 このソフト(ARToolKit時計)の作者である、たろサさんが実際にやってみているので どのような感じになるかはそれを参照のこと。 (オートパワーオフは厳禁らしい) なお、質感をともなって実体化するわけではないのでその点ご留意を。 (スクリーンショット情報) 全:Aurex2 RC4 + WinShot ver1.53a
https://w.atwiki.jp/hakuryu7orange/pages/15.html
拡張現実を生み出すARToolKitについてのメモ 環境設定 Release構成について 他端末での実行 テクスチャ Release構成について 「MSVCP71D.dll」と「MSVCR71D.dll」がないと(たぶん)怒られるので、Debag版より持ってくる。 この「MSVCP71D.dll」については、多々議論があるようで、実行ファイルのある場所へのコピペでいいのかは疑問。「system32」にはDがついていないものが入っているが、この場所にコピペするのは、賛否諸説あるらしく、詳しいことはよく分からない。 追加の依存ファイルにDebag構成で追加したもの達を追加する。 他に、何か怒られたら、それを追加すれば問題なく動く。 他端末での実行 Release構成で作成した実行ファイルを、他端末で実行する場合、「glut32.dll」が必要になる。 これは「C \Windows\System32」にコピーすればよいが、別の方法(こっちのほうが簡単かも)として、実行ファイルがある場所に、一緒においておけば問題ない。 テクスチャ 24ビットのビットマップしか駄目らしー。 あと、正方形である必要があるっぽい。 正方形以外だと、縦横の長さの差分だけ、長さが短い方にテクスチャが張られず、色がない状態のまま出力される。
https://w.atwiki.jp/wildbadger/pages/23.html
まずは環境を整えよう!! 0. 環境 0-1.念のため、動作環境を確認。 PC lenovo ThinkPad Edge (※内蔵カメラ付き) OS Windows 7 Home Premium 64bit SP1 Core Intel(R)Core(TM) i7-2640M CPU @ 2.8GHz 2.8GHz メモリ 8G 1. Visual Stadio Express 2012をDL http //www.microsoft.com/ja-jp/dev/express/default.aspx VS2012_WDX_JPN.iso (インストール...※プロダクトキーをもらわないと30日限定になってしまうので注意) 2. GLUT 取得 GLUT(OpenGL Utility Toolkit)とは、 OpenGLに基づいて設計された、FORTRANとANSIに準拠したC言語のクラスライブラリのことである。 OSのシステムレベルでのI/Oを制御し、3Dグラフィックスを描画することができる。 1994年、シリコングラフィックス(SGI)社のマーク・キルガード(Mark J. Kilgard)によって開発された。 GLUTを用いることによって、OSが描画するウィンドウを制御したり、 マウスやキーボードからの入力によってウィンドウを操作したりすることができる。 描画されたウィンドウはジオメトリ変換による高品位な立方体や球体として再現することが可能である。 また、GLUTは、OSを制御するプライマリレベルで機能しているため、 OSに依存せずに描画機能を使用することができるという特徴を持っている。 以下よりglut-3.7.6-bin.zipをDL http //user.xmission.com/~nate/glut.html 3. ARToolKit 入手 以下よりARToolKit-2.72.1-bin-win32.zipをDL http //sourceforge.net/projects/artoolkit/files/ 4. サンプルプログラムを動かしてみる。 ①3で入手したARToolKit-2.72.1-bin-win32.zip・glut-3.7.6-bin.zip を解凍します。 ARToolKit-2.72.1-bin-win32.zip - ARToolKit フォルダが作成される。 glut-3.7.6-bin.zip - glut-3.7.6-bin フォルダが作成される。 ②C \に解凍した ARToolKit フォルダを移動。 ③ glut-3.7.6-bin フォルダの glut32.dll をC \ARToolkit\binへコピー ④C \ARToolkit\patterns\にある pattHiro.pdf を印刷しておく(これがマーカーね) ⑤C \ARToolkit\bin\にある simpleLite.exe を実行する。 ...珍しく無事に起動。マーカーを写すと立方体の図形が出現!!! (実行画面は添付します... simpleLite実行画像 ) simpleLite実行.jpg ... simpleLite.exe実行初期画面 simpleLite1.jpg ... simpleLite.exe実行画面1 simpleLite2.jpg ... simpleLite.exe実行画面2 5. アプリケーション構成 各種ライブラリについて 5-1 アプリケーション構成 WindowsアプリケーションにてARToolKitを動作させるには以下が必要です。 ①ARToolKit ... ARアプリケーション作成を実現するための簡易ライブラリ ②GLUT ... 3D、2Dを描画するためのライブラリ ③その他 ... ユーザープログラム 5-2 各種ライブラリ Debug用ライブラリ:libARd.lib libARgsubd.lib libARvideod.lib opengl32.lib glu32.lib glut32.lib Release用ライブラリ:libAR.lib libARgsub.lib libARvideo.lib opengl32.lib glu32.lib glut32.lib ar.h(libARd.lib、libAR.lib) ⇒ARToolKitの基本サブルーチン arMulti.h(libARMultid.lib、libARMulti.lib) ⇒マルチマーカのサブルーチン gsub.h(libARgsubd.lib、libARgsub.lib) ⇒OpenGLでの描画サブルーチン gsub_lite.h(libARgsub_lited.lib、libARgsub_lite.lib ⇒ARToolKitのための有用なOpenGLルーチンの集まり gsubUtil.h(libARgsubUtild.lib、libARgsubUtil.lib) ⇒OpenGLのユーティリティサブルーチン matrix.h ⇒ARToolKitの数学サブルーチン param.h ⇒ARToolKitのグローバルパラメータ video.h(libARvideod.lib、libARvideo.lib) ⇒ビデオデバイスサブルーチン 今日はここまでzzzz [参考] tsujimotter http //tsujimotter.info/2012/05/14/artoolkit-1/ 黒い森から来た少年 http //3335.blog106.fc2.com/blog-entry-103.html GLUTについて http //opengl.softwarecarpenter.biz/?eid=949759 俺のCG部屋 ARToolKit基本プログラム http //www.cg-ya.net/imedia/ar/artoolkit_base_program/
https://w.atwiki.jp/wildbadger/pages/24.html
サンプルアプリケーションを作成してみよー C \ARToolkit\ARToolKit.slnがあるが VisualStadio2012で動作させようとするが(simpleLite含む複数プロジェクトが登録されている) エラーが大量にでてしまう。。。 追うのも面倒なのでひとまず 『simpleLite』単体のみのプロジェクトを作成することにする。。。(;_;) 1.Visual Studio2012 にプロジェクト作成 [ファイル]- [新しいプロジェクト]- [空のプロジェクト]を選択し、 Project1 を作成する。 (実際にはC \sample\Project1\に作成) 2.プロジェクト環境を整える 2-1 『simpleLite』には各種DLLが必要なので以下のパスを登録 ①[コントロールパネル]- [システム]- [設定の変更]- [詳細設定タブ]- [環境変数]をクリック ②[システム環境変数]- [Path]をクリックし、 ;C \ARToolkit\bin\ を追加する。 2-2 ライブラリの追加 ①Visual Studio2012のソリューションエクスプローラー (デフォルトなら左にある)から Project1 を右クリックし、[プロパティ]をクリック ②[C/C++]- [追加のインクルードディレクトリ]に以下を追加 C \ARToolkit\include C \ARToolkit\DSVL\src ③[リンカー]- [追加のライブラリディレクトリ]に以下を追加 C \ARToolkit\lib C \ARToolkit\DSVL\lib 2-3 main.c作成 ひとまず『simpleLite』として動作させたいので C \ARToolkit\examples\simpleLite\simpleLite.cをコピーし、 作成したプロジェクトフォルダに移動 リネーム(main.c) ソリューションエクスプローラーからmain.cを追加。 ⇒環境構築完了(『simpleLite』としては。。。。) 3.実際にコンパイル 動作を確認してみる 3-1 コンパイル(F7キーまたは[ビルド]- [ソリューションのビルド]) 以下ビルドログ 1 ------ すべてのリビルド開始 プロジェクト Project1, 構成 Debug Win32 ------ 1 main.c 1 c \sample\project1\project1\main.c(455) warning C4996 sprintf This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1 c \program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h(357) sprintf の宣言を確認してください。 1 c \sample\project1\project1\main.c(456) warning C4996 sprintf This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1 c \program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h(357) sprintf の宣言を確認してください。 1 LINK warning LNK4098 defaultlib LIBCMT は他のライブラリの使用と競合しています。/NODEFAULTLIB library を使用してください。 1 Project1.vcxproj - C \sample\Project1\Debug\Project1.exe ========== すべてリビルド 1 正常終了、0 失敗、0 スキップ ========== ⇒sprintf()にてwarningがでているが、ひとまずシカトするwww 3-2 main.c改造する。 ①main.cそのままでは各種データファイルの読込部分が動作しないので 以下の通りに修正する。 main.c main() const char *cparam_name = ../data/camera_para.dat ; // // Camera configuration. // #ifdef _WIN32 char *vconf = ../data/WDM_camera_flipV.xml ; #else char *vconf = ; #endif const char *patt_name = ../data/patt.hiro ; ②①の通りに各種データファイルを移動する。 プロジェクトディレクトリ/data/ 例)C \sample\Project1\data\ ・camera_para.dat ・patt.hiro ・WDM_camera_flipV.xml 3-2 実行してみる(F5キーまたは[デバッグ]- [デバッグ開始]) ⇒うんうん、正常に動作している!!
https://w.atwiki.jp/mypad/pages/38.html
この中ではにたような言葉が使われますので、手元にダウンロードして違いを理解してから読んでください。 ARtoolkit(=ARTK=本家)→hp ARtoolkitPlus(=Plus=発展系亜種)→hp ofxARToolkitPlusExample(example=ofxをつかったxcodeのofサンプル)→hp→hp2 ofxARtoolkitPlus(ofx=openframeworksアドオン上のに入ってるやつ) ちなみに環境はosx10.7,xcode3,openframeworks61です。 ARtoolkitの概念をまず勉強する。 ARtoolkitではまずカメラの補正と、マーカータグの登録を行います。 カメラの補正は動けばいいやってことで、適当にしがちですが、ディスプレイ環境とか複数マーカー環境ではやっておくべきでしょう。これって、web環境ではカメラデバイスの補正値を最初に取得させるんでしょうかね、、、。それともメーカーの型番とかから判定するのかな、、、。 ofでofxARToolkitPlus artk;というラッパークラスをつかって作ると、ofからPlusが使えるようになります。artkはofxARToolkitPlusオブジェクトです。artk.setup()で内部的にはカメラパラメーターを取得します。addon/ofxARToolkitPlus/ofxARToolkitPlus.cppとヘッダファイルをみると void ofxARToolkitPlus setup(int w, int h) { // load std. ARToolKit camera file // These need to be in the data folder setup(w, h, "LogitechPro4000.dat", "markerboard_480-499.cfg"); } とあります。 ARToolKit camera fileとあるので、カメラ補正自体はARToolkitの付属ソフトで作れるはず(と思う)。 アドオンに入っているかと思えば、入っていないので、まあ自分で探せということでしょう。 http //www.hitl.washington.edu/artoolkit/download/ からダウンロードしておいてください。 ARToolkit/bin/calib_camera2.exe がそれです。 この辺りで方法を学習してください。 たとえばLogitechPro4000.datというデータができたとしましょう。 できたらxcodeのアドオンサンプルの中のdataフォルダに入れておきます。 付属ソフトをつかって、カスタムタグの登録もできます。 ARToolkit/bin/mkpatt.exe でできます。 おなじくこの辺りで学習して下さい。 例えばpatt.hiroとかいうデータができるはずです。 これでLogitechPro4000.datとpatt.hiroというカメラ設定とオリジナルマーカー設定の2つに必要なデータができました。 ARToolkitのソフトでつくったパラメータファイルがARToolkitPlusで動くのかどうか?これを次に検証します。 exampleのdataフォルダの中にデフォルトでおいてあるLogitechPro4000.datの内容をみてみます。すると、人の言葉でないので読めない。たぶんバイナリデータだと思うのですが、バイナリエディタで読んでみましたが意味は不明。さてどうしましょ。このデータができるプロセスをみてみることにします。 Plusの内部的には TrackerMultiMarkerImplというトラッカークラスを内部的に生成します。 トラッカークラスとマルチマーカーという新しい言葉がでてきました。 トラッカークラスは映像からマーカーを抽出するためにもうけられた抽象的なクラスと推測できますが、どうなんでしょう、、、。 マーカーはシングルマーカーとマルチマーカーの2つがあります。シングルマーカーはひとつのマーカーです。一方マルチマーカーとは一枚の紙に複数のマーカを印刷したものということで、複数のマーカーの相対的な距離まで登録されているので、ひとつだけ欠けたとしても、周りのマーカーから類推して表示することができるタイプのマーカーです。こちらを参照マーカーのサイズはいろいろあってもかまわないようですが、相対的な距離を指定して決めておかないといけません。 複数のマーカーをmkpatt.exeでつくっておいて、ARToolkit/bin/Data/multiフォルダにいれて、定義ファイルmarker.datとかいうをテキストファイルでつくって同じフォルダに入れておくというのが流れのようです。が、exampleにはAllBchThinMarkers.pngという画像ファイルと、markerboard_480-499.cfgという謎の拡張子(たぶんコンフィグ)のファイルしかありません。怪しいですね。これを開いてみると、バイナリではなく、テキストでした。おお、マルチマーカの定義ファイルのようです!発見。でも480番から499番までの20個しか定義されていません。さてどうしましょう? ofで setup(w, h, "LogitechPro4000.dat", "markerboard_480-499.cfg"); と記述したところは最終的にPlusのトラッカークラス内で arMultiReadConfigFile(nMultiFile) とかいう関数で処理されています。 マルチマーカーの定義ファイルの読み込みはARTK的にはarMulti.hに書いてあるとのことなのですが、Plus的にはarMultiReadConfigFile.cxxっぽいのでこれを読んでみます。(アドオンのソースにはいってる) ARMultiEachMarkerInfoT *marker;っていうポインタアドレスに arMalloc(marker,ARMultiEachMarkerInfoT,num);でマーカー個数分の構造体が入るためのメモリ領域を確保してるみたい。 arMallocはar.hで定義されてる。中をみると、構造体がARMarkerInfoとARMarkerInfo2の2タイプあるけど、どちらもマルチマーカー用ではないようです、、、。 int area; int id; int dir; ARFloat cf; ARFloat pos[2]; ARFloat line[4][3]; ARFloat vertex[4][2]; が定義されている。 これはARTKでいうとこのARMarkerInfo(マーカーひとつが持っている属性を束ねた構造体)という構造体と一緒ですね。 arMultiReadConfigFileをみると marker[i].patt_id marker[i].width marker[i].center[0~1] marker[i].trans[0~2][0~3] marker[i].pos3d[0~3][0~2] があるからmarker構造体がどっかにあるはず?とおもって探すと。 ARMultiEachMarkerInfoT *markerと ARMultiMarkerInfoT *marker_info 構造体が定義されているのはarMulti.hだとわかりました。 typedef struct { int patt_id; ARFloat width; ARFloat center[2]; ARFloat trans[3][4]; ARFloat itrans[3][4]; ARFloat pos3d[4][3]; int visible; /*---*/ int visibleR; } AR_EXPORT ARMultiEachMarkerInfoT; つまりマーカー個別の情報ね typedef struct { ARMultiEachMarkerInfoT *marker; int marker_num; ARFloat trans[3][4]; int prevF; /*---*/ ARFloat transR[3][4]; } AR_EXPORT ARMultiMarkerInfoT; つまりマーカー個別の情報がいくつどっち向いてんの?みたいなやつね。 戻り値として、ARMultiMarkerInfoT構造体をリターンします。中には個別の情報も入ってる。便利。ポインタってnewしなくていいの楽だな。倉庫に適当においとけ、場所だけメモっとけってことだもんね。 でも,結局パターンファイルを読み込みんでいるだけで、コンフィグデータの内容まではわかりませんでしたね、、、。まあ、そんなもんです。 では今度は画像をどうやって読み込んでいるのかを検証してみます。 of的には artk.update(grayImage.getPixels()); という記述です。 ofxCvGrayscaleImage grayImage; このgrayImageというクラスはなんと、openCVアドオンのクラスです。 grayImage.allocate(width, height); すると unsigned char* pixels; というchar型(0~255の値×画素数)が格納されているポインタアドレスを返してきます。 こりゃ便利。 grayImage.getPixels()メソッドは画素そのものをゲットするのではなく、画素をpixelsというポインタアドレス上に格納してそのアドレスだけ返してます。なんて効率的!C言語って感じですね〜。 artk.update(画像のポインタアドレスを渡す); までわかりました。 これをPlusの内部的にはどう処理しているのかをみていきます。 int ofxARToolkitPlus update(unsigned char *pixels) { return tracker- calc(pixels); } calcに渡すだけ、、、。colcは何を返すのか、、、。TrackerMultiMarkerImpl.cxxをみてみます。 当然intなのですが内容はnumDetectedなので、認識したタグの個数ですね。 処理内容は認識した個数分のidとARMarkerInfo構造体を TrackerMultiMarkerImpl.hで定義されている2つのプロテクト変数に格納します。 intdetectedMarkerIDs[AR_TEMPL_TRACKER MAX_IMAGE_PATTERNS]; ARMarkerInfodetectedMarkers[AR_TEMPL_TRACKER MAX_IMAGE_PATTERNS]; それから、バトンしてofまでint型でマーカーの個数を返します。 では次 artk.draw(640, 0); はどうでしょう。 ARToolKitPlus ARMarkerInfo marker = tracker- getDetectedMarker(i); でARMarkerInfoをごっそりゲットして marker.vertex[0][0] こんな感じでメンバ変数を使えちゃうということらしいですね。 うーん。なるほど〜。 でもやりたいポイントは、違うんよね〜。 では次こそは、オリジナルマーカーの登録を目指します!
https://w.atwiki.jp/artoolkit/pages/15.html
サンプルモデルを動かすまでの手順 物臭人は一番下に一式のセットフォルダ。 1. ARToolKit Home Pageから、 ARToolkit-2.72.1.tgz DSVL-0.0.8b.zip OpenVRML-0.14.3-win32.zipをダウンロード( ω *) 2. GLUT for Win32から、 glut-3.7.6-bin.zipをダウンロード。 3. glut-3.7.6-bin.zipを解凍。 「glut32.dll」を「C \windows\system32」に入れる。 「glut.h」を自分の開発環境の「include\GL」フォルダに入れる. <VisualC++6.0の場合> C \Program Files\Microsoft Visual Studio\VC98\Include\GL 「glut32.lib」を自分の開発環境の「Lib」フォルダに入れる. <VisualC++6.0の場合> C \Program Files\Microsoft Visual Studio\VC98\Lib 4. 【1】 ファイルの解凍とコピー ARToolkit-2.71.2.tgz,DSVL-0.0.8b.zip, OpenVRML-0.14.3-win32.zipをそれぞれ解凍. 「ARToolKit」の中に「DSVL」と「OpenVRML」を移す. 「ARToolKit」を「C \Program Files\」に移す. 以下の3つのDLLファイルを「ARToolkit\bin\」にコピー. ARToolKit\DSVL\bin\DSVL.dll ARToolKit\DSVL\bin\DSVLd.dll ARToolKit\OpenVRML\bin\js32.dll 「ARToolKit\Configure.win32.bat」をダブルクリックして実行. 【2】 VisualC++の設定 VisualC++を起動。 メニューから「ツール>オプション」→「ディレクトリ」タブをクリック. 「表示するディレクトリ」を「インクルードファイル」にした状態で,下の空白の横にある「...」ボタンをクリックして C \PROGRAM FILES\ARTOOLKIT\INCLUDE を追加。 次に「表示するディレクトリ」を「ライブラリファイル」にした状態で,同様にして C \PROGRAM FILES\ARTOOLKIT\LIB を追加。 次にライブラリとサンプルプログラムを自分でコンパイルして作成します. 「ARToolKit\ARToolKit.dsw」をVisualC++で開いてください. VisualC++のメニューを「ビルド>バッチビルド」とたどり,「ビルド」をクリック。 5. C \Program Files\ARToolKit\patterns\pattHiro.pdfを印刷。 6. C \Program Files\ARToolKit\bin\simpleLite.exeを起動。 カメラの初期設定をして完成。
https://w.atwiki.jp/artoolkit/pages/2.html
メニュー TOP Member ARToolKit PTAM 素材 リンク ARToolKIt 工学ナビ 素人がはじめるARToolKit日記 毛の生えたようなもの Pipe Render PTAM Cagylogic マーカレスAR(PTAM)のソースコードを動かしてみた 4403 is written 釣堀.net PTAM + Metasequoia Schlechte Welt ここを編集