ARToolの仕組みについて。
ブログからの転載です。かなりラフ(書き方や内容)に書いてあるので、
詳しく知りたい方は書籍等で研究されて下さい。
いずれちゃんとした文体及び式で書き直したいです。
ARToolの仕組み1
分かりやすいように厳密な表記はしません。
なんとなーく、分かればそれでいい。
そんな解説書です。
詳しいことを知りたい人は、作者の論文読めばいいと思うよ。
ちなみに私はかるーく読んでます。
それでは第1回いってみよう!!
今回はARToolが何を読み取ってるかです。
基本中の基本です。
ARToolがマーカーを読み取ってるのは皆さん知ってると思いますが、
このマーカーの形がポイントなのです。
このマーカーは正方形。
なんだ普通じゃん。当たり前じゃん。
ええ、その通りなのですが
正方形だからこそ分かることがあるのです。
ところで皆さん、遠近法って知ってますか?
そう、遠くの物が小さく見えるやつ。
ARToolではこの正方形と遠近法を上手く組み合わせます。
カメラで認識したマーカーの正方形が
遠近法で歪んでいるので、
それを逆算してマーカーがどれくらい傾いているかを判断します。
この計算に使うのは正方形の淵のラインで、
まぁ数学的に色々するわけですが、これでマーカーがどれくらい傾いているか
3次元の回転行列が求まるわけですな。
ついでにマーカーの大小で、並進行列もわかるっぽいです。
ついでにこの計算だけだとマーカーの上下が分からないので、
マーカーの正方形の中に模様を入れるらしいです。
マーカーの模様は複数個の識別だけではないのですな。
ということで、今回はここまで。
今回分かって欲しいことは、マーカーの認識には遠近法による正方形の歪みを使っていること。
その歪みから回転行列や並進行列が求まること。
またマーカーの模様から、マーカーの向き(上下左右)が分かること。
以上です。
次回は回転行列や並進行列の詳しい内容についてです。
ついでに言うとこの解説書、行列が分からない人は分からないと思います。
現在の指導要領がどうなってるか知りませんが、
多分、数学Cの範囲だったような気がします。
忘れてしまった人や、知らない人は教科書をめくってみましょう。
パズル的な感覚でやれば、案外簡単かも?
ARToolの仕組み2
前回はARToolの基礎、マーカーの認識について。
回転行列、並進行列などが分かるよってとこまで。
今回はまずそれぞれの行列の正体についてです。
回転行列はその名の通りカメラ座標からマーカー座標が
どれだけ回転しているかを示す行列です。
カメラ座標は右がXc、下がYc、奥がZc
マーカー座標は綿に右がXm、上がYm、面に垂直がZm
ここら辺は工学ナビに図があるので参考にしてください。
この回転行列は3×3で与えられます。
まぁ、詳しいことは行列が分かれば分かると思うんで
式だけのっけときます。
|Xc| |r1 r2 r3| |Xm|
|Yc| = |r4 r5 r6|
|Ym|
|Zc| |r7 r8 r9| |Zm|
これで十分だよね?Rが回転行列です。
mとcが逆のような気がすると思いますが、
本当はこの回転行列はマーカー座標からカメラ座標の変換を表すのです。
じゃあそう最初から書けよ。
この回転行列はこの値からだけでは、それぞれの軸が何度動いたか分かりません。
これはあくまでもそれぞれの軸に対して回転させた結果なのです。
つまりX軸に対してφ、Y軸に対してθ、Z軸に対してψ回転させたとすると、
それぞれの回転ベクトル(3×3)は
X
|cosφ -sinφ 0|
|sinφ cosφ 0|
|
0 0 1|
Y
|1 0
0 |
|0 cosθ -sinθ|
|0 sinθ cosθ|
Z
|cosψ -sinψ 0|
|sinψ cosψ 0|
|
0 0 1|
この3つを掛け合わせたのが回転行列Rです。
R
|cosφcosψ-sinφcosθsinψ
-cosφsinψ-sinφcosθcosψ sinφsinθ|
|sinφcosψ+cosφcosθsinψ
-sinφsinψ+cosφcosθcosψ
-cosφsinθ|
|sinθsinψ
sinθcosψ
cosθ |
従って今行列Rが与えられているので
r9 = cosθ
r7^2+r8^2 =
(sinθ)^2
となります。ただしここでsinθの正負があるので、
回転情報の縮退が起きてしまいます。
まぁとりあえず情報を保管する方法(理論?)はその内紹介しましょう。
sinθ≠0ならば
cosφ = -r6/sinθ
sinφ =
r3/sinθ
cosψ = r8/sinθ
sinψ = r7/sinθ
ということで、一応回転行列Rが分かることによって
各軸に対して何度回転しているかが分かることになります。
詳しく知りたい人はオイラー角とググって下さい。
並進行列はもっと簡単で、3×1の行列です。
それぞれ順番にXYZ軸にどれだけ座標中心が平行移動したかを表します。
|Xc| |x| |Xm|
|Yc| = |y|
|Ym|
|Zc| |z| |Zm|
まぁ、こんな感じです。
次回は実際に回転行列や並進行列をARToolから取り出します。
ARToolの詳しいプログラムの仕方は
工学ナビなどを参考にして下さい。
ここではあくまで上記の行列を取り出すだけです。
あとC言語わかんねっていう人は、独習Cを読んでね。
あれは超良書です。独習Cを推薦する文だけで記事が一つ書けます。
ということで取り出し方。
arGetTransMat関数を使います。
引数を以下のようにとったとします。
arGetTransMat(&marker_info[i], patt_center, patt_width, patt_trans);
patt_transは3×4の配列です。
中身は回転行列の隣に並進行列が入ってます。
|r1 r2 r3 x|
|r4 r5 r6 y|
|r7 r8 r9 z|
patt_trans[2][3]=z
patt_trans[1][2]=r6
ですな。
marker_infoは構造体です。
配列なのは、画面上で読み取ったマーカーの数だけあるってこと
marker_info.vertex
マーカーの四隅の画面上の座標が入る、4×2の配列。
マーカーの右上から時計回りとかそういうことは無い。
画面の左から順番とかそんなイメージだが、詳しい順番は分かんない。
marker_info.pos
マーカーの中心の画面上の座標で0×2の配列。pos[2]
marker_info.dir
マーカーの向き。0〜3が入る。
上向きだと2だったかな?
これはマーカーの模様で判断しているんだと思う。
判定の位置がビミョーなせいで、わりと使い辛い。
でも情報縮退対策には必須。
marker_info構造体はこれ以外にも沢山ブツを持ってますが、
詳しいことは公式ページのDocumentationを読んでください。
英語だけど、APIの項だけならなんとかなるでしょう?
上でも少し触れましたが、
情報の縮退対策です。
回転行列からオイラー角が求まりますが、情報が縮退してます。
これは三角比の宿命です。
しかし、このARToolの場合は紙面上のマーカーを判定していることと
マーカーの向きを得られるということにより、
プログラムの組み方次第では情報を復元できるのではないかと思ってます。
本当はHSPプログラムコンテストではそこまでやりたかったのですが、
間に合わなかった。
多分マーカーの四隅の情報も駆使するとわりと簡単に・・・できるかなぁ?