2009年2月7日土曜日

サンプルを更新

ここにおいてあるARToolktPlus+DShowNET+WPFのサンプルを更新した。

今回、デフォルトを自分用のキャリブレーショファイルにしてしまったので、これで上手くいかない場合は設定でLogitech_Notebook_Pro.calを選択するか、このエントリを参考に自分用のキャリブレーションファイルを作ってください。

それと、もう少しましなPCカメラ欲しいなあ。同じ30万画素でも普通はもっとましらしいし、ネット通販ならそれらでも980円で買えたりする。ちょっとGroovy GR-CAM030はひどすぎる。980円とは言え、安物買いの・・・って奴だ。

And finally...

MatlabのスクリプトってC++にコンバートした上でコンパイルするなんて事ができるので、もしかしたらと思って探したら、Camera Calibration Toolbox For MatlabのModified Versionのページで紹介されていたー

さあ、これでたぶん、カメラのキャリブレーションが自前でできるぞ。

実際にやってみた。

まず、Windows 7でやっているので、.net framework 1.1がないと怒られた。

http://www.microsoft.com/downloads/details.aspx?familyid=262D25E3-F589-4842-8157-034D1E7CF3A3&displaylang=ja

http://www.microsoft.com/downloads/details.aspx?FamilyId=04DBAF2E-61ED-43F4-8D2A-CCB2BAB7B8EB&displaylang=ja

をダウンロードしてインストール。

http://research.graphicon.ru/calibration/gml-c-camera-calibration-toolbox-5.html
から GML C++ Camera Calibration Toolbox の``Latest Binaries''をダウンロードしてインストール。

インストール先の``Calibration pattern''フォルダ中のpattern_A4.pdfを印刷。

GML Camera Calibration Toolboxを起動して、白紙のアイコンのボタンをクリック。。pattern_A4.pdfを印刷したなら、Object Sizeは7, 10, square sizeは24(実測値を使う事!)くらいを入力。

何らかの方法で印刷したパターンを撮影した画像を用意する。私が使用しているGroovy GR-CAM030では、ボタンを押すと動画のキャプチャソフトが起動する(付属CDからドライバをインストールしたわけではないのでWindows 7標準の機能かもしれない)が、ここでもう一度ボタンを押すと静止画がキャプチャできる。何枚か用意する。この時
http://research.graphicon.ru/calibration/recommendations-for-taking-calibration-photos.html
を参考にして色々な姿勢から撮影する。枚数は多い方が良い。意外と認識に失敗する事が多い。また、全ての画像のサイズは等しくする事。全ての測定結果はピクセルで表される。

プラス記号のアイコンのボタンをクリックして画像を全部追加する。チェッカーボードが二枚重なっているボタンを押すと全ての画像に対して認識が試行される。失敗した画像はマイナスのアイコンのボタンで削除。あまり成功枚数が少ないor姿勢のバリエーションが少なければ、新たに画像を追加してチェッカーボード一枚のアイコンのボタンで個別に認識を試行できる。

カメラのアイコンのボタンを押すとキャリブレーションが実行される。
で、下のようなテキストファイルを作る。分かり易いように``,''を入れたが、これは実際には書いてはいけない。

ARToolKitPlus_CamCal_Rev02
使用した画像の幅, 使用した画像の高さ, 出力されたprincipal pointの一つ目, 出力されたprincipal pointの二つ目, 出力されたfocal lengthの一つ目, 出力されたfocal lengthの二つ目, Distortionの四つの数字を順に, 0.0, 0.0, 10くらいの好きな数字


これで自分のカメラ用のキャリブレーションファイルが完成!!・・・と思う。

ちょっと気になるのは、640x480の画像を使ってGroovy GR-CAM030をキャリブレーションすると、principal pointのxが420くらいになる事。実際にずれているのか、それともパラメタの解釈か手順に問題があるのか・・・。

で、このキャリブレーションファイルを使ってARしてみた結果:

まあ特に何が変わったとも思えないけど心なしか自然になった気がする。ブラシーボ効果かもしれない。

体調

今の薬の処方になってから、朝方に少しだけ集中力が得られる時間帯ができて、それでプログラミングなんかをしたりして、そして昼頃にかけて結局いつもの持続する倦怠感・眠気、目がショボショボ、風邪っぽい症状が強まって、何も手につかないのが耐えられなくて倦怠感を吹き飛ばそうと無理やりに外出して強烈に疲れて帰ってくる、という感じになっている。人間って面白くて、調子がよければ少しだらけ気味にアクティブに動くのだけど、中途半端に調子が悪くいと、とてもアクティブに動くのだ。だから最近、外出する頻度はむしろ上がっているのだが、朝方の時間帯を除けば、結局体調は悪くなる一方。もう、自分の足で歩けるのはいつまでやら、という思いから無理に外出しているだけという感じ。

来月にもう一度CFSの専門医の診察を受ける事になっているが、診断名すらつかない状況だけでも解決して欲しいという気持ち半分、現状治療法のない病気という絶望的結論を怖がる気持ち半分というところ。

しかし最近のAR関連の活動もそうだが、人間、こんなどん底でも色々な事ができる物だ。人間というものに心底感心する。

MATLABでキャリブレーションできるらしい?

MATLAB camera calibration toolboxでキャリブレーションすると、ほとんどARToolkitPlusが必要とするのと同じ形式でパラメタが得られるらしい。

Description of Calibration Parametersの項を見ると、2次元ベクトルであるfc, cc(これがARToolkitPlusのパラメタfc_x, fc_y, cc_x, cc_yにあたるのだろう)と、5次元ベクトルであるkc, そしてスカラalpha_cが得られる結果であるらしい。

そして、First Calibration Exampleのページを見ると、
Notice that the skew coefficient alpha_c and the 6th order radial distortion coefficient (the last entry of kc) have not been estimated (this is the default mode). Therefore, the angle between the x and y pixel axes is 90 degrees. In most practical situations, this is a very good assumption.
と書いてある。つまり、alpha_cはピクセルのx軸とy軸のなす角度の90度からのズレを表していて、これは普通無視して良く、実際ARToolkitPlusのキャリブレーションパラメタに対応するパラメタはない。一方で、ARToolkitPlusはkc_1からkc_6までを要求するが、このToolboxではkc_6は計算しないのがデフォルト。という事は得られた5次元ベクトルkcの要素を順にkc_1,..., kc_5とし、kc_6は0とすれば良いわけだ。

ARToolkitPlusのカメラキャリブレーションファイルの形式
ARToolKitPlus_CamCal_Rev02
xsize ysize cc_x cc_y fc_x fc_y kc1 kc2 kc3 kc3 kc5 kc6 iter
と比較すると、結局、iterは好きな数を指定し、xsize, ysizeはキャリブレーションに用いた画像のサイズを指定し、そしてcc_x, cc_y, fc_x, fc_y, kc1,..., kc_6はこのツールボックスの出力から得られる事になる。

Matlabを持っていないので試せないけれどね。

追記:というか、ARToolkitPlusのページには、
Improved camera calibration model (MATLAB camera calibration toolbox support)

As of version 2.0, ARToolKitPlus is compatible with the camera calibration
model used by Jean-Yves Bouguet's Camera Calibration Toolbox for MATLAB. An improved version of the toolbox (highly recommended) that includes automated corner/calibration object detection is available
from the Graphics Media Lab at Moscow State University.

The ASCII-file containing the camera calibration parameters should look as follows:
[line1]: ARToolKitPlus_CamCal_Rev02
[line2]: xsize ysize cc_x cc_y fc_x fc_y kc1 kc2 kc3 kc3 kc5 kc6 iter

xsize, ysize: calibrated frame dimensions (does not have to match the frame dimensions at runtime)
cc_x, cc_y: principal point location (in pixels)
fc_x, fc_y: focal length (in pixels)
kc1..kc6: radial/tangential distortion coefficients (kc6 currently not in use)
iter: number of iterations for distortion compensation

It is strongly recommended to enable undistortion lookup tables when using the improved calibration model.
A detailed description of the calibration parameters is available here.
と書いてあるので、kc_1からkc_5までをツールボックスの出力から取得して、kc_6は0にするという事で本当にかまわないようだ。それから、iterは大きい方が計算精度が上がるが時間がかかる、と。いいなー。MATLAB欲しいなあ。

Artoolkit Plus用のキャリブレーションの仕方

Artoolkit Plus用のカメラキャリブレーションファイルの作り方だが、必要な情報としてはArtoolkit付属のキャリブレーションツールで全て得られるらしい。ただ、表示される情報とArtoolkit Plusのカメラキャリブレーションファイルのフォーマット内のパラメタとの対応が不明確。

以下推測に基づく手順:
ArtoolkitのSourceForgeのページからARToolKit-2.72.1-bin-win32.zipを取ってきて適当な場所に解凍する。これにはバイナリが入っているので、キャリブレーションの目的だけならビルドの必要はない。

工学ナビの記事のこの項にある手順を実行する。ARToolkitの置き場所などは適宜読み替える。

最後に表示された
SIZE = 640, 480
Distortion factor = 375 223.5 6.2 1.003
1323.86047 -18.27697 410.18302 0.00000
0.00000 1285.40599 -243.19888 0.00000
0.00000 0.00000 1.00000 0.00000

が重要。これは、この記事中のパラメタ名の意味で、おそらく
SIZE = xsize, ysize
Distortion factor = cc_x cc_y 謎 謎
fc_x 謎1 謎2 謎
謎4 fc_y 謎3 謎
謎5 謎6 謎 謎

と並んでいる。分からないのはkc1 kc2 kc3 kc3 kc5 kc6 iterの7個のパラメタだが、最近のカメラなら歪み補正はされているだろうので、全て0で良いだろう。まあ、私のカメラは980円の安物のGroovy GR-CAM030で歪みまくっていたが。

#たぶん謎1~謎6が何らかの順番でkc1~kc6に対応していると考えられる。

そういうわけで、このケースだと、
ARToolKitPlus_CamCal_Rev02
640 480 375 223.5 1323.86047 1285.40599 0.0 0.0 0.0 0.0 0.0 0.0 0

という内容を持ったテキストファイルを作って、たとえばGroovy GR-CAM030.calというファイル名で保存する。

ちなみにここに公開しているARToolkit(Plus)+DShowNET+WPFのVisual C# 2008用サンプルでは、ARWithWPF.exe.config中でカメラキャリブレーションファイルを指定できるようになっているので、ここで紹介している手順でカメラキャリブレーションファイルを作ったらこのファイルを編集して欲しい。

キャリブレーション前(画角が不適切):

キャリブレーション後: