ARToolKit プログラムの仕組み 1: ヘッダファイルのインクルード 2: Main 関数 3: Main Loop 関数 4: マウス入力処理関数 5: キーボード入力処理関数 6: 終了処理関数 3: Main Loop 関数 1カメラ画像の取得 2カメラ画像の描画 3マーカの検出と認識

Similar documents
Microsoft Word - 卒業論文 docx

Microsoft Word - 上善_卒論最終版.doc

コンピュータグラフィックスS 演習資料

2 2 2 OpenGL Linux Linux Video for Linux(Video4Linux, v4l ) API Video4Linux USB IEEE1394 API Linux Video for Linux 2(Video4Linux2, v4l2 ) OpenCV API U

02: 変数と標準入出力

02: 変数と標準入出力

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Tekutama AR ~ 拡張現実感によるオーバーレイ表示と動作 ~ 情報物理研究室 渡部 修平 1

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

memo

Microsoft Word - Cプログラミング演習(10)

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

02: 変数と標準入出力

卒業研究報告書 題目 3DCG と Web カメラの合成を表現するプログラムの制作 指導教員 綿森道夫准教授 報告者 学籍番号 : 氏名 : 尾川景子 平成 23 年 2 月 8 日 高知工科大学電子 光システム工学科 1

PowerPoint プレゼンテーション

memo

02: 変数と標準入出力

gengo1-11

第2回

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

演算増幅器

プログラミング基礎

プログラミング基礎

Microsoft PowerPoint ppt

Taro-最大値探索法の開発(公開版

イントロダクション

Taro-ポインタ変数Ⅰ(公開版).j

program7app.ppt

スライド 1

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

演算増幅器

Microsoft Word - no11.docx

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft PowerPoint - adi05.ppt [互換モード]

memo

問 1 図 1 の図形を作るプログラムを作成せよ 但し ウィンドウの大きさは と し 座標の関係は図 2 に示すものとする 図 1 作成する図形 原点 (0,0) (280,0) (80,0) (180,0) (260,0) (380,0) (0,160) 図 2 座標関係 問 2

JavaプログラミングⅠ

Microsoft Word - 3new.doc

目次 はじめに 概要 プロジェクトウィンドウ フレームワーク ユーザークラス サンプル コンストラクタ デストラクタ OnUserIO()

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Microsoft PowerPoint - kougi7.ppt

memo

Microsoft Word - no202.docx

Prog1_10th

プログラミングI第10回

Microsoft PowerPoint - prog03.ppt

AquesTalk プログラミングガイド

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

モデリングとは

Microsoft PowerPoint - kougi9.ppt

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

ファイル入出力

Taro-ファイル処理(公開版).jtd

Microsoft PowerPoint - 11.pptx

Microsoft Word - no15.docx

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

pp2018-pp9base

PowerPoint Template

Microsoft PowerPoint - 計算機言語 第7回.ppt

プログラミング実習I

Microsoft Word - no12.doc

AquesTalk for WinCE プログラミングガイド

Microsoft PowerPoint P演習 第10回 関数.ppt [互換モード]

Taro-リストⅠ(公開版).jtd

02: 変数と標準入出力

AquesTalk Win Manual

Microsoft Word - no103.docx

Microsoft PowerPoint pptx

ファイル入出力

PowerPoint プレゼンテーション

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

コンピューターグラフィックスS

02: 変数と標準入出力

演算増幅器

Microsoft Word - Cプログラミング演習(11)

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

メソッドのまとめ

Microsoft PowerPoint - [150421] CMP実習Ⅰ(2015) 橋本 CG編 第1回 幾何変換.pptx

第1回 プログラミング演習3 センサーアプリケーション

AR技術を用いたグリーティングカード作成ソフトの開発

Taro-再帰関数Ⅲ(公開版).jtd

PowerPoint プレゼンテーション

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

NM30操作DLL(SSK.DLL)

Microsoft Word - Cプログラミング演習(9)

cp-7. 配列

講習No.9

Microsoft PowerPoint - OOP.pptx

Microsoft PowerPoint - lec10.ppt

02: 変数と標準入出力

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

Microsoft PowerPoint - prog04.ppt

表示の更新もそういた作業のひとつに当たる スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由

Microsoft PowerPoint - diip ppt

情報処理Ⅰ演習

ソフトゼミA 2015 第0回

PowerPoint プレゼンテーション

Transcription:

ARToolKit プログラムの仕組み 1: ヘッダファイルのインクルード 2: Main 関数 3: Main Loop 関数 4: マウス入力処理関数 5: キーボード入力処理関数 6: 終了処理関数 3: Main Loop 関数 1カメラ画像の取得 2カメラ画像の描画 3マーカの検出と認識 4 次の画像のキャプチャ指示 5マーカの信頼度の比較 6マーカの位置 姿勢の計算 7バッファの内容を画面に表示 // メインループ関数 ----------------- void MainLoop(void) { ARUint8 *image; ARMarkerInfo *marker_info; int marker_num; int j, k; // カメラ画像の取得 if((image = (ARUint8 *)arvideogetimage()) == NULL) { arutilsleep(2); return; ARUint8 *image; ARMarkerInfo *marker_info; int marker_num; int j, k; ARVideoGetImage() 関数によって, ビデオデバイス (USB カメラ ) から画像を取得する. この関数は画像データへのポインタを返す. ポインタの型は ARUnit8 というオリジナルの型だが, これは unsigned char 型と同じ.ARToolKit では画像データを格納するためのバッファを内部に持っていて, 自前でメモリを管理する必要はない.

1カメラ画像の取得 // カメラ画像の取得 if((image = (ARUint8 *)arvideogetimage()) == NULL) { ビデオデバイス (USBカメラ) から画像を取得 画像データへのポインタ arutilsleep(2); スリープ.() の中は休止時間 return; 画像の準備ができていない時は NULL を返す. 画像データが準備できないと以後の処理を行えないので,arUtilSleep() によって適当なスリープ ( 休止時間 ) を置いた後, 一度メインループを抜ける // カメラ画像の描画 argdrawmode2d(); argdispimage( image, 0, 0 ); 2 カメラ画像の描画 argdrawmode2d(); argdispimage( image, 0, 0 ); AR アプリケーションではカメラ画像を描画した後で,3D オブジェクトを重ねて描画する. ARToolKit ではカメラ画像を描画する際にレンズによるゆがみの補正も行うようになって いる. カメラ画像を描画するためには, まず argdrawmode2d() という関数によって 2 次元 画像を描画するための準備をした後で argdispimage() 関数を使って画像を描画する. argdispimage( image: image 画像データへのポインタ 0 : xwin 表示領域の番号 ( 表示領域が1つしかない場合は 0 ) 0 : ywin )

xwin と ywin は, ウィンドウ内に複数の表示領域を設けた際に, 描画する場所を指定する ために使う. // マーカの検出と認識 if( ardetectmarker( image, thresh, &marker_info, &marker_num) < 0){ Cleanup(); exit(0); 3 マーカの検出と認識 if( ardetectmarker( image, thresh, &marker_info, &marker_num) < 0){ Cleanup(); exit(0); カメラ画像の中からマーカを見つけ, そのマーカのパターンを認識する関数が ardetectmarker() である. ardetectmarker( image :dataptr 画像データへのポインタ thresh : 二値化の閾値 (ARToolKit では, 画像を二値化して検出 ) &marker_info : マーカ情報を格納する配列へのポインタ ARToolKit では, 検出したマーカの情報を内部のバッファに保存している. そのバッファへのポインタを marker_info が返す仕組みになっている. &marker_num : ) 検出されたマーカの数

4 次の画像のキャプチャ画像 // 次の画像のキャプチャ指示 arvideocapnext(); arvideocapnext(); 取得した画像について画像の描画とマーカの検出が終わったら, 次の画像の指令を出す必 要がある. 次フレームのキャプチャを支持するには arvideocapnext(); を使う. 5 マーカの信頼度の比較 // マーカの信頼度の比較 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; マーカとして検出される領域の中にはマーカではない領域 ( 誤検出 ) も含まれる. マーカごとに対応したオブジェクトを正しく表示するためには, 検出されたマーカの中から特定のパターンIDをもち, かつ最も高い信頼度を持つものを探し出す必要がある. 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;

for ループを抜けると, パターンID((marker_info[j].id)=カメラでとらえた画像 ) が patt_id( 検出されるマーカ ) に一致し, かつ信頼度 (marker_info[j].cf) が最も高いマーカの番号が変数 k に格納される. パターン ID が一致するものが無ければ k=-1 となる. 複数のマーカを扱う場合は, パターンIDごとにこの処理を行う必要がある. 6 マーカの位置 姿勢の計算 if ( k!= -1){ // マーカの位置 姿勢 ( 座標変換行列 ) の計算 argettransmat( &marker_info[k], patt_center, patt_width, patt_trans ); //3Dオブジェクトの描画 DrawObject(); この argettransmat() では検出されたマーカの情報からマーカ カメラ間の座標変換行列を 求めている. 座標変換行列 とは, ここでいうカメラに対するマーカの三次元位置 姿 勢のことである. argettransmat 座標変換行列を求める. ( &marker_info[k], : marker_info マーカ情報を格納した変数へのポインタ patt_center, : center マーカの原点位置 ( マーカ上のどこに原点を置くか ) patt_width, : width マーカのサイズ patt_trans : conv マーカ カメラ間の座標変換行列 ( マーカ座標系をカメラ 座標系 ) が返ってくる ); Conv[3][4] は, 3 4の行列になっている. マーカ位置 姿勢を計算した後は 3D オブジェクトの描画処理を行う. サンプルプログラ ムでは, 描画処理の部分を DrawObject() という関数にまとめる.

7 バッファの内容を画面に表示する // バッファの内容を画面に表示 argswapbuffers(); ARToolKit のグラフィックス処理系ではダブルバッファが使われている. ダブルバッファとは, 画像やCGを連続で描画する際にちらつきが起きないようにするための仕組みである. 画面のちらつきが起きるのは描画している過程が見えてしまうためであり, 表画面 ( フロントバッファ ) と裏画面 ( バックバッファ ) という2つのバッファを用意して, 表画面を表示している間に裏画面に描画し, 表と裏を入れ替えることにより描画の過程が見えないようにする. argswapbuffers() 関数は表画面と裏画面を入れ替える関数であり, これによって以前の描画処理が画面に反映される.