cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

OpenCV3.4のChArUcoキャリブレーションを試す(その1)マーカーボードの生成

ARマーカーは、2次元カメラの画像から3次元位置姿勢を特定するために便利なツールです。奈良先の加藤先生のARToolkitを筆頭に、もう随分前に完成して進歩がないものだと思っていましたが、知らない間に少し便利になっているようです。
そのうちの一つ、ArUcoという実装が公開され、OpenCV3.2ぐらいからcontribに採録されています[1][2]。
ArUco: a minimal library for Augmented Reality applications based on OpenCV | Aplicaciones de la Visión Artificial
ArUcoマーカーとチェッカーボードを組み合わせたChArUcoがロバストで速いとのことなので、今日はこれを試してみたいと思います。狙いは、精度の向上ではなく、マーカーの一部しか画面に写っていなくてもキャリブレーションできるロバスト性をテストすることです。

ChArUcoマーカーの作成

ChArUcoマーカーの作成は、OpenCV Contribのサンプルを使って生成します。
たとえば、Ubuntu環境でユーザのホームにopencv_contribを展開している場合、次のようにビルドします。
2017-12-13のタイムスタンプでVer. 3.0のArUcoが出ていますね。気になります。

cd ~/opencv_contrib/modules/aruco/samples
g++ -o create_board_charuco create_board_charuco.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

です。ビルドの詳細は[3]、pkg-configの使い方は[4]などを参照のこと。
実行は

./create_board_charuco "chboard.png" -w=5 -h=7 -sl=200 -ml=120 -d=10

のように引数を指定して行います。この例の値は、[1]に倣っています。
helpによると、引数の詳細は次の通り。

Create a ChArUco board image
Usage: create_board_charuco [params] outfile

--bb (value:1)
Number of bits in marker borders
-d
dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2,DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16
-h
Number of squares in Y direction
-m
Margins size (in pixels). Default is (squareLength-markerLength)
--ml
Marker side length (in pixels)
--si (value:false)
show generated image
--sl
Square side length (in pixels)
-w
Number of squares in X direction

outfile (value:locate)
Output image

生成されたマーカーはこんな感じ。
f:id:cvl-robot:20180129131124p:plain
これを印刷して、チェッカーの実寸を定規等で測って、板などに貼り付けます。

[1] OpenCV: ArUco marker detection (aruco module)
[2] 軽量な AR ライブラリの ArUco について調査中 - Qiita
[3] OpenCV3 ArUcoサンプルのビルド - メモ
[4] LinuxでOpenCVを入れて適当なコードをコンパイルするまで – .COM-POUND