Apriltagは、Robotics Researchで人気のある視覚的な金融システムです。このリポジトリには、より高速な(> 2x)検出器、小さなタグの検出率の改善、柔軟なタグレイアウト、およびポーズ推定を含む、Apriltagの最新バージョンApriltag 3が含まれています。 Apriltagは、依存関係が最小限の小さなCライブラリで構成されています。
事前に生成されたレイアウトのタグ画像をここで見つけることができます。 TagStandard41H12レイアウトを使用することをお勧めします。
Apriltagは次の論文の主題です。
Apriltag:堅牢で柔軟な視覚的なFiducialシステム
Apriltag 2:効率的で堅牢なFiducial検出
Fiducialタグの柔軟なレイアウト
正式にはLinuxオペレーティングシステムのみがサポートされていますが、ユーザーもWindowsにインストールすることに成功しています。
デフォルトのインストールは、/usr/local/include/inclued and sharedライブラリに/usr/local/libにヘッダーを配置します。また、/usr/local/lib/pkgconfigにpkg-configスクリプトをインストールし、python3がインストールされている場合はpythonラッパーをインストールします。
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
これにより、デフォルトで共有(*.so)ライブラリが構築されます。 static(*.a)ライブラリが必要な場合は、 BUILD_SHARED_LIBS
OFF
に設定します。
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
忍者( sudo apt install ninja-build
)がインストールされている場合は、以下を使用できます。
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
忍者ビルドスクリプトを介して生成してコンパイルします。 CmakeのデフォルトのMakeFileジェネレーターよりもはるかに高速になります。
これをインストールせずにローカルで使用する場合にのみ、 --target install
省略できます。
アプリケーションの大部分では、TagStandard41H12ファミリが正しい選択になります。 Apriltag-Imgsリポジトリのタグの画像を見つけることができます。お気に入りの編集者の画像をスケールアップして印刷します。
他のタグファミリを選択する時期のいくつかのヒューリスティック:
これらがあなたのニーズに合っていない場合は、ここで独自のカスタムタグファミリを生成してください。
import cv2
import numpy as np
from apriltag import apriltag
imagepath = 'test.jpg'
image = cv2.imread(imagepath, cv2.IMREAD_GRAYSCALE)
detector = apriltag("tagStandard41h12")
detections = detector.detect(image)
または、Duckietownが作成したApriltag Pythonバインディングを使用できます。
image_u8_t* im = image_u8_create_from_pnm("test.pnm");
if (im == NULL) {
fprintf(stderr, "Failed to load pnm image.n");
exit(1);
}
apriltag_detector_t *td = apriltag_detector_create();
apriltag_family_t *tf = tagStandard41h12_create();
apriltag_detector_add_family(td, tf);
zarray_t *detections = apriltag_detector_detect(td, im);
for (int i = 0; i < zarray_size(detections); i++) {
apriltag_detection_t *det;
zarray_get(detections, i, &det);
// Do stuff with detections here.
}
// Cleanup.
apriltag_detections_destroy(detections);
tagStandard41h12_destroy(tf);
apriltag_detector_destroy(td);
ここにサードパーティが提供しています。
ここにサードパーティが提供しています
ほとんどのユースケースでは、これは交換の低下になるはずです。
このライブラリには外部依存関係がないことに注意してください。ほとんどのアプリケーションでは、少なくとも画像を取得する方法が必要です。
OpenCVを使用してC ++でApriltagを使用する例については、example/opencv_demo.ccを参照してください。この例アプリケーションは、以下を実行して構築できます。
$ cd examples
$ make opencv_demo
CV :: MATオブジェクトの画像データは、深いコピーを作成せずにApriltagに渡すことができます。 CV :: MATデータバッファーのImage_u8_tヘッダーを作成するだけです。
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
quad_decimateパラメーターを増やすと、検出距離のコストで検出器の速度が向上します。問題を投げるための追加のCPUコアがある場合は、nthreadsを増やすことができます。画像がややうるさい場合、quad_sigmaパラメーターを増やすと速度が向上します。
最初にイメージのサンプルを選択し、デバッグ= 1で検出器を実行してデバッグ画像を生成します。これらは、検出パイプラインの各ステップでの検出器の出力を示しています。タグの境界が四辺形として検出されていない場合は、Quad_decimateを減少させます(必要に応じて1まで)。タグの境界が検出された場合は、decode_sharpeningの変更を実験します。
次のように、タグのポーズを計算する方法を提供します(solvepnp_ippe_squareを使用してOpenCVのPNPソルバーを交互に使用します)。 apriltag_pose.hヘッダーファイルを含めてから、次のようにatmatiate_tag_pose関数を呼び出す必要があります。
// First create an apriltag_detection_info_t struct using your known parameters.
apriltag_detection_info_t info;
info.det = det;
info.tagsize = tagsize;
info.fx = fx;
info.fy = fy;
info.cx = cx;
info.cy = cy;
// Then call estimate_tag_pose.
apriltag_pose_t pose;
double err = estimate_tag_pose(&info, &pose);
// Do something with pose.
...
パラメーターが次のとおりです。
det
:タグ検出struct(curry_detection_t)。tagsize
:メートル単位のタグのサイズ。各タグデザインには黒い境界線と白い境界線がありますが、一部のデザインには内側に白い境界線があり、一部は内側に黒い境界線があります。したがって、Tagsizeは2つの境界線が出会う場所から測定されます。例については、以下の図を参照してください。fx
、 fy
:カメラの焦点距離(ピクセル)。ほとんどのカメラでは、 fx
とfy
等しいか、ほぼ同等になります。cx
、 cy
:カメラのフォーカルセンター(ピクセル)。ほとんどのカメラでは、これは画像センターとほぼ同じです。注:タグのサイズは、タグの外側から測定しないでください。タグのサイズは、検出コーナー間の距離、または白い境界と黒の境界の間の端の長さとして定義されます。次の図は、48H12CUSTOMタグファミリのタグのための赤いXSを備えた検出コーナーとタグのサイズをマークします。
座標系は、カメラセンターに起源があります。カメラの中心からZ軸がカメラレンズの中心に向かっています。 X軸は、カメラが撮影した画像の右側にあり、Yはダウンしています。タグの座標フレームは、タグの中心にあり、右にx軸、y軸がダウンし、z軸がタグに入ります。
ASAN
オプションを設定することにより、Debug Buildのメモリ問題をデバッグするアドレスサンイタイザーを有効にすることができます。
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
ほとんどの場合、実行可能ファイルを通常どおりに実行して、Sanitiserの出力を検査できます。 ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
対応するlibasan.so.5
をプリロードする必要があります。
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3は、Apriltag 2でサポートされているクラシックレイアウトに加えて、さまざまな可能なタグレイアウトをサポートしています。タグのデータビットはタグの境界線の外側に移動できるようになりました。データビットがないボーダー。このリポジトリには以下が含まれています。
他のリポジトリであるApriltag-Generationを使用して、独自のタグファミリを生成できます。
プライベートメッセージを送信する代わりに、質問については、このgithubに問題を作成してください。これにより、同じ質問をしている他の人があなたの答えを見つけることができます。