ARToolKitの解析 その① 変換行列の計算
安定化の次は、プログラムの高速化などをやってみようと思ってましたが、
高速化のためには、ARToolKitのソースをもっと理解していなければなりません。
そこで、次に「ARToolKitの解析」を行うことにしました。
解析のその1は、変換行列の計算アルゴリズムの解説をやってみます。
ここでいう変換行列とは、マーカー(オブジェクト)座標系から、グローバル(カメラ)座標系へ変換する行列のことです。
これは、ARToolKitの重要な仕組みの1つです。
---- < 変換行列計算の概要 > ----
BGM:エコテロニカ(sansuiさん)
OpenGLなどの3DCGでは、3Dモデルの移動・回転などを行うために、座標系の変換行列を用います。
ARToolKitの場合も、この変換行列がないと、マーカー上にモデルを表示できません。
プログラムでは、スクリーン上に映ったマーカーの画像から、この変換行列を計算しています。
計算のプロセスは、大まかに以下のようになります。
1.マーカーの黒い四角形を認識する
2.四角形の枠である、4辺を計算する
3.それぞれの辺を、カメラの投影方向に伸ばし、面を作る
4.面の法線を計算
5.向かい合った面同士の法線から、外積を計算する
6.その外積同士から、さらに外積を計算
7.現在わかっている式を用いて、行列の残り値を計算する
今回は"スクリーン上の4角形の4辺"から、"変換行列の3×3の要素"を計算するとこまでを中心に、解説していきます。
---- < 1.マーカーの黒い四角形を認識 > ----
四角形の認識ではまず、カメラに映った画像を2値化(白黒に)します。
そして、その白黒画像から、4角形を探します。
さらに、見つけた4角形が登録されているマーカーかどうか調べます。
この部分の詳しいアルゴリズムについては、後日解説するつもりです。
---- < 2.四角形の枠である、4辺を計算する > ----
ここも、1と一緒に解説いたします。
---- < 3.それぞれの辺を、カメラの投影方向に伸ばし、面を作る > ----
4角形の辺が取得できたら、この辺を伸ばして、面にします。
伸ばし方は、辺がスクリーンへ投影された方向に伸ばします。
つまりこの面は、3次元空間上のマーカーの4辺も通ることになります。
カメラの視点、2Dのマーカーの辺、3Dのマーカーの辺を繋ぐ面です。
---- < 4.面の法線を計算 > ----
それぞれの面の法線(面に対して、垂直なベクトル)を計算します。
---- < 5.向かい合った面同士の法線から、外積を計算する > ----
法線が計算できたら、向かい合った面同士の法線から、外積を計算します。
外積は、2つの法線に対し垂直になります。
この外積は、マーカー座標系の1つの軸を表すベクトルになります。
---- < 6.その外積同士から、さらに外積を計算 > ----
さらに、外積同士の外積をとります。
この3つの外積が、それぞれマーカー座標系のX軸, Y軸, Z軸になります。
さらに値を補正すると、変換行列の3×3の要素になるわけです。
---- < 8.現在わかっている式を用いて、行列の残り値を計算する > ----
変換行列の3×3の要素は、回転や拡大縮小を表しています。
変換行列に必要な残りの要素は、平行移動です。
平行移動分を計算するには、それまでに用いられた行列等の式を使い、答えを出します。
以上が、僕が理解できた範囲でのアルゴリズムの説明です。
間違いや不足があった場合には、連絡をお願いします。
高速化のためには、ARToolKitのソースをもっと理解していなければなりません。
そこで、次に「ARToolKitの解析」を行うことにしました。
解析のその1は、変換行列の計算アルゴリズムの解説をやってみます。
ここでいう変換行列とは、マーカー(オブジェクト)座標系から、グローバル(カメラ)座標系へ変換する行列のことです。
これは、ARToolKitの重要な仕組みの1つです。
---- < 変換行列計算の概要 > ----
BGM:エコテロニカ(sansuiさん)
OpenGLなどの3DCGでは、3Dモデルの移動・回転などを行うために、座標系の変換行列を用います。
ARToolKitの場合も、この変換行列がないと、マーカー上にモデルを表示できません。
プログラムでは、スクリーン上に映ったマーカーの画像から、この変換行列を計算しています。
計算のプロセスは、大まかに以下のようになります。
1.マーカーの黒い四角形を認識する
2.四角形の枠である、4辺を計算する
3.それぞれの辺を、カメラの投影方向に伸ばし、面を作る
4.面の法線を計算
5.向かい合った面同士の法線から、外積を計算する
6.その外積同士から、さらに外積を計算
7.現在わかっている式を用いて、行列の残り値を計算する
今回は"スクリーン上の4角形の4辺"から、"変換行列の3×3の要素"を計算するとこまでを中心に、解説していきます。
---- < 1.マーカーの黒い四角形を認識 > ----
四角形の認識ではまず、カメラに映った画像を2値化(白黒に)します。
そして、その白黒画像から、4角形を探します。
さらに、見つけた4角形が登録されているマーカーかどうか調べます。
この部分の詳しいアルゴリズムについては、後日解説するつもりです。
---- < 2.四角形の枠である、4辺を計算する > ----
ここも、1と一緒に解説いたします。
---- < 3.それぞれの辺を、カメラの投影方向に伸ばし、面を作る > ----
4角形の辺が取得できたら、この辺を伸ばして、面にします。
伸ばし方は、辺がスクリーンへ投影された方向に伸ばします。
つまりこの面は、3次元空間上のマーカーの4辺も通ることになります。
カメラの視点、2Dのマーカーの辺、3Dのマーカーの辺を繋ぐ面です。
---- < 4.面の法線を計算 > ----
それぞれの面の法線(面に対して、垂直なベクトル)を計算します。
---- < 5.向かい合った面同士の法線から、外積を計算する > ----
法線が計算できたら、向かい合った面同士の法線から、外積を計算します。
外積は、2つの法線に対し垂直になります。
この外積は、マーカー座標系の1つの軸を表すベクトルになります。
---- < 6.その外積同士から、さらに外積を計算 > ----
さらに、外積同士の外積をとります。
この3つの外積が、それぞれマーカー座標系のX軸, Y軸, Z軸になります。
さらに値を補正すると、変換行列の3×3の要素になるわけです。
---- < 8.現在わかっている式を用いて、行列の残り値を計算する > ----
変換行列の3×3の要素は、回転や拡大縮小を表しています。
変換行列に必要な残りの要素は、平行移動です。
平行移動分を計算するには、それまでに用いられた行列等の式を使い、答えを出します。
以上が、僕が理解できた範囲でのアルゴリズムの説明です。
間違いや不足があった場合には、連絡をお願いします。

初めましてkazです。
ブログの内容はだいたい読みました。
かなりわかりやすい内容でびっくりしました。
自分もARToolkit使っているのですが、examplesの中のtwoviewのプログラムがどうしても実行できません。
WDM_camera_flipV.xml内のfriendly_nameを書き換えてもカメラ2台同時出力ができません。
何か意見が欲しいです。お願いします。
ちなみに、OSはWindows XPです。
USBカメラはBUFFALO BWC-30L01 USB PC Camera
を2台使用しています。
プログラムはMicrosoft Visual C++ 6.0を使って入力しています。
返事が遅くなってすみません。
twoviewに関しては、使ってみたいと思っていますが、
現在カメラが1台しかなく、実行できません。
ちょうど解析の後に、twoviewを使ったプロジェクトを作るつもりだったので、その時にはお役に立てるかもしれません。