I am Charmie

メモとログ

Aruco in OpenCV

OpenCVで実装されているArucoに関するメモ.あくまでもPython
Versionは4.0.0.21テスト
チュートリアルに書いてある内容+α.

dictionary(マーカのセット)は2種類
1. predefined dictionary: あらかじめ用意されているマーカ
2. custom dictionary: 自作するdictionary

Predefined dictionaryは2種類
cv2.aruco.getPredefinedDictionary()を使って取得.
AprilTagは異なるマーカ間のハミング距離が保証されている一方で,Arucoの標準セットはされていないっぽい*.
1. Aruco Original: 標準セット
2. AprilTag: AprilTag
* dictionary.hppの138,139行目を読むと,DICT_ARUCO_ORIGINALは0 minimum distanceと書いてある.根拠は無いけど,DICT_NXN_*も同じと考えた方が良いのかな.

Aruco Original dictionaryはビット数が異なる4種類
1. DICT_4X4_*: 16 ( = 4x4)ビット
2. DICT_5X5_*: 25 ( = 5x5)ビット
3. DICT_6X6_*: 36 ( = 6x6)ビット
4. DICT_7X7_*: 49 ( = 7x7)ビット

*の部分はマーカの数を指定するための数値.
マーカの数が多くなるほど異なるマーカ間のハミング距離が小さくなる確率が高くなるため,マーカの数は必要最小限に設定する方が良いそうだ.

AprilTagはビット数・最小ハミング距離が異なる4種類
"%dh%d"という表記になっているが,前半はビット数,後半は異なるマーカ間の最小ハミング距離.
最小ハミング距離とマーカの数はdictionary.hppの159−162行に書いてある.
この表を見る限り,36h11を使うべきかなぁ.
()内の数字はマーカの数
1. DICT_APRILTAG_16h5 (30)
2. DICT_APRILTAG_25h9 (35)
3. DICT_APRILTAG_36h10 (2320)
4. DICT_APRILTAG_36h11 (587)

custom dictionaryは自作マーカ用
cv2.aruco.custom_dictionary(nMarkers, markerSize, randomSeed)関数を使えば作れる.
この関数で作られるマーカ(おそらくAruco標準マーカも)は回転の不変性を考慮し,1つのコードに対して4パターン(0,90,180,270度回転)のコードを保持する.
- nMarkers: マーカの数
- markerSize: 1次元のビット数 (markerSize x markerSizeのマーカを作成)
- randomSeed: 乱数のシード

bytesList
生成された2次元コードの情報を保持する.
3次元numpy.array型のオブジェクト.
dictionary.hppの51-60行に書いてあるけど,bytesList[i, j, k]はk番目に回転したi番目のマーカのj番目のバイトを表す.