マーカーの姿勢推定は、トラッキングや自己位置推定に有用です。 マーカーを用いた姿勢推定はARToolKitやArUco等で提案されていますが、マーカー検出処理に含まれるラベリングや輪郭検出あたりは重い処理です。これに対して、QRコードの位置検出パターンのようなfisheyeパターンを用いて高速化したものも提案されています。(https://cir.nii.ac.jp/crid/1050574047078214528) このプログラムはそれとはまた別の、Fisheyeパターンを用いた高速なマーカー姿勢推定の実装の試みです。
- example_track_camera
- カメラ入力からマーカー検出と姿勢推定するサンプル
- create_marker
- マーカー画像を出力するユーティリティ
- marker_finder
- マーカー検出の本体
- marker_format
- マーカーのフォーマット
- fisheyeパターンを利用する
- 誤マッチしにくい
- 縦横が独立した走査になるので計算量が小さい
- 一度の走査で全てのマーカーを見つけることができる
- wgpuで並列化する
- GPGPUによる高速化
- webへの移植性の確保
- 状態を持たない
- 起動時やエラーがあった際に初期化する必要がない
- 状態を持つフィルタを後付けして精度向上を図ってもよい
- 位置・姿勢検出パターン
- 左上にfisheyeパターンを配置
- 右上、左下に、白黒反転したfisheyeパターンを配置
- マーカーID情報
- マーカー右下に配置
- 右下中央にアラインメント用のパターン(未使用)
- 8bitのID情報をLDPC(Low Density Parity Code)で12bitに符号化し、周囲に配置
- fisheyeの検出 画像を2値化し、縦横の畳み込みによって検出します。OpenCVのQRコード検出のように白黒ストライプの比による検出をする手もありますが、これは計算総量は小さくても並列化した際のオーダーやノイズ耐性の面で不利になると考え、畳み込みを採用しています。
- クラスタリング fisheye検出結果はfisheye毎に複数の点が得られるので、これらをx-meansでクラスタリングし、fisheyeと1対1で対応する点を得ます。ここが一番時間のかかる処理のようです。
- ペアリング 同一のマーカーに属するfisheye同士をつないだ線では白黒のパターンが一意に定まることを利用し、これを畳み込みで計算してfisheyeからマーカーを得ます。
- 大きさ、位置、回転の計算 マーカーを構成する3点のfisheyeから、マーカーの画像上の大きさ、位置、回転を計算できます。2D上の大きさと位置から3D上の位置へ変換するにはカメラパラメータと撮影したマーカーの3Dでの大きさが必要ですが、今回は取り扱っていません。
- IDの読み取り 画像上のマーカーをアフィン変換、2値化し、IDの符号を読み取り、復号します。