これらは、AprilRoboticsが開発したApriltags 3ライブラリのPythonバインディングです。 Matt ZuckerのApriltags2 Bindingsに触発されました。
元のライブラリは、BSD 2-Clauseライセンスで公開されています。
pip
(またはPython 3用のpip3
)を使用してインストールできます。
pip install dt-apriltags
特定のリリースが必要な場合は、次のように追加します。
pip install [email protected]
このリポジトリをクローンし、ナビゲートします。次に、Apriltagsサブモジュールを初期化します。
$ git submodule init
$ git submodule update
Apriltags Cライブラリを構築し、新しく構築されたライブラリをPIPホイールに埋め込みます。
$ make build
新しいホイールは、ディレクトリdist/
で利用可能になります。これでホイールを取り付けることができます
pip install dt_apriltags-VERSION-pyPYMAJOR-none-ARCH.whl
注:このライブラリの現在のVERSION
とPython使用したPYMAJOR
のバージョンに基づいて、CPU ARCH
のアーキテクチャとともに、上記のファイル名はさまざまです。
このライブラリは、Python 2
および3
の建物ホイールをサポートしています。 Python 2はデフォルトで使用されます。次のコマンドを使用して、Python 3用に構築します。
make build PYTHON_VERSION=3
このライブラリは、CPUアーキテクチャamd64
、 arm32v7
、およびarm64v8
の建物ホイールをサポートしています。デフォルトアーキテクチャはamd64
です。アームアーキテクチャ用のホイールを構築する場合、QEMUを使用してターゲットCPUをエミュレートします。次のコマンドを使用して、 arm32v7
アーキテクチャ用に構築します。
make build ARCH=arm32v7
コマンドを実行して、 dist/
内部に構築されたすべてのホイールをリリース(pypi.orgにプッシュ)することができます
make upload
次のコマンドを使用して、Python 2および3およびCPUアーキテクチャamd64
およびarm32v7
のホイールを構築およびリリースします。
make release-all
使用法の例は、 test.py
ファイルで見ることができます。 Detector
クラスは、Apriltags機能をめぐるラッパーです。次のように初期化できます。
at_detector = Detector(searchpath=['apriltags'],
families='tag36h11',
nthreads=1,
quad_decimate=1.0,
quad_sigma=0.0,
refine_edges=1,
decode_sharpening=0.25,
debug=0)
オプションは次のとおりです。
オプション | デフォルト | 説明 |
---|---|---|
家族 | 'tag36h11' | ファミリーにタグがあります。スペースで区切られています |
nthreads | 1 | スレッドの数 |
max_hamming | 2 | 成功したタグ検出を生成するために、反転させることができる最大数のビット数。ノイズがいくつかのデータビットを誤って読み取らせると、誤ったネガを減らすのに役立ちますが、誤検知を増加させることもあります。 |
quad_decimate | 2.0 | クワッドの検出は、低解像度の画像で行うことができ、ポーズ精度のコストで速度を改善し、検出率のわずかな低下を行うことができます。バイナリペイロードのデコードは、まだ完全な解像度で行われます。これを1.0に設定して、完全な解像度を使用します。 |
quad_sigma | 0.0 | セグメント化された画像にガウスのぼかしを適用する必要があるもの。パラメーターは、ピクセルの標準偏差です。非常に騒々しい画像はゼロ以外の値の恩恵を受けます(例えば0.8) |
refine_edges | 1 | ゼロ以外の場合、各クワッドのエッジは、近くの強力な勾配に「スナップ」に調整されます。これは、最初のクワッド推定の品質を大幅に向上させる可能性があるため、デシメーションが使用される場合に役立ちます。一般的に(1)にあることをお勧めします。非常に計算的に安価です。 quad_decimate = 1の場合、オプションは無視されます |
decode_sharpening | 0.25 | デコードされた画像にはどのくらいのシャープニングを行う必要がありますか?これは小さなタグを解読するのに役立ちますが、奇妙な照明条件や低光の状態で役立つ場合とそうでない場合があります |
SearchPath | ['apriltags'] | Apriltag 3ライブラリを探す場所はリストでなければなりません |
デバッグ | 0 | 1の場合、デバッグ画像を保存します。非常に遅く動作します |
画像内のタグの検出は、検出器のdetect
方法を実行することによって行われます。
tags = at_detector.detect(img, estimate_tag_pose=False, camera_params=None, tag_size=None)
タグのポーズも抽出する場合は、 estimate_tag_pose
True
に設定し、 camera_params
( [fx, fy, cx, cy]
)とtag_size
(メートル単位)を提供する必要があります。 detect
メソッドは、それぞれ次の属性を持つDetection
オブジェクトのリストを返します(アスタリスクのある属性を持つものは、 estimate_tag_pose=True
の場合にのみ計算されることに注意してください):
属性 | 説明 |
---|---|
tag_family | タグの家族。 |
tag_id | タグのデコードされたID。 |
ハミング | いくつのエラービットが修正されましたか?注:多数の修正されたエラーを受け入れると、誤検知率が大幅に増加します。注:この実装の時点で、検出器はハミング距離が3を超えるタグを検出できません。 |
decision_margin | バイナリデコードプロセスの品質の尺度:データビットの強度と決定のしきい値の平均差。数値が高いと、ほぼ優れたデコードが示されています。これは、非常に小さなタグのみでのみ検出精度の合理的な尺度です。大きなタグには効果的ではありません(少しセル内のどこかでサンプリングでき、それでも良い検出を得ることができます。) |
ホモグラフィ | 「理想的な」タグ((-1,1)、(1,1)、(1、-1)、および(-1、-1)の角を持つ「理想的な」タグからの投影を説明する3x3ホモグラフィマトリックスは、画像。 |
中心 | 画像ピクセル座標の検出の中心。 |
コーナー | 画像ピクセル座標のタグの角。これらは常にタグの周りで反時計を賢く包みます。 |
pose_r* | ポーズ見積もりの回転マトリックス。 |
pose_t* | ポーズ見積もりの翻訳。 |
pose_err* | 推定のオブジェクトスペースエラー。 |
カスタムレイアウトを使用する場合は、Cソースとヘッダーファイルを作成してから、再度ライブラリを構築する必要があります。次に、新しいlibapriltag.so
ライブラリを使用します。元のApriltagsリポジトリの詳細については、詳細を確認できます。
ホイールはDockerコンテナ内に構築されています。このリポジトリのルートにあるdockerfileは、ビルド環境のテンプレートです。ビルド環境はubuntu:18.04
に基づいており、Pythonの正しいバージョンはその場でインストールされています。 make build
コマンドは、ホイールを構築する前に存在しない場合、ビルド環境を作成します。
ビルド環境(Docker Image)の準備ができたら、次の構成でDockerコンテナが起動されます。
/source
に取り付けられたこのリポジトリのルート。dist/
宛先ディレクトリの下/out
として取り付けられています。 assets/build.sh
からの建物のスクリプトは、コンテナ内で実行されます。ビルドステップは次のとおりです。
/source
から一時的な場所にソースコードをコピー(コンテナ内)apriltags/
(.so.so Libraryファイルを生成する)からApriltagライブラリをビルドします)package_data
として埋め込まれています)/out
(コンテナのdist/
にポップアップします)