Apriltag adalah sistem fidusia visual yang populer dalam penelitian robotika. Repositori ini berisi versi terbaru dari apriltag, apriltag 3, yang mencakup detektor yang lebih cepat (> 2x), peningkatan laju deteksi pada tag kecil, tata letak tag fleksibel, dan estimasi pose. Apriltag terdiri dari perpustakaan C kecil dengan dependensi minimal.
Anda dapat menemukan tag gambar untuk tata letak yang dihasilkan sebelumnya di sini. Kami merekomendasikan menggunakan tata letak tagstandard41h12.
Apriltag adalah subjek dari makalah berikut.
Apriltag: sistem fidusia visual yang kuat dan fleksibel
Apriltag 2: deteksi fidusia yang efisien dan kuat
Tata letak yang fleksibel untuk tag fidusia
Secara resmi hanya sistem operasi Linux yang didukung, meskipun pengguna juga berhasil menginstal pada Windows.
Instalasi default akan menempatkan header di/usr/local/include dan shared library in/usr/local/lib. Ini juga menginstal skrip pkg-config ke/usr/local/lib/pkgconfig dan akan menginstal pembungkus python jika python3 diinstal.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Ini akan membangun perpustakaan bersama (*.so) secara default. Jika Anda membutuhkan perpustakaan statis (*.a) Set BUILD_SHARED_LIBS
untuk OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
Jika Anda memiliki ninja ( sudo apt install ninja-build
) diinstal, Anda dapat menggunakan:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
untuk menghasilkan dan menyusun melalui naskah ninja build. Ini akan jauh lebih cepat daripada dengan generator makefile default CMake.
Anda dapat menghilangkan --target install
jika Anda hanya ingin menggunakan ini secara lokal tanpa menginstal.
Untuk sebagian besar aplikasi, keluarga TagStandard41H12 akan menjadi pilihan yang benar. Anda dapat menemukan gambar untuk tag di repo apriltag-IMGS. Meningkatkan gambar di editor favorit Anda dan mencetaknya.
Beberapa heuristik untuk kapan memilih keluarga tag lainnya:
Jika tidak ada yang sesuai dengan kebutuhan Anda, hasilkan keluarga tag khusus Anda sendiri di sini.
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)
Bergantian Anda dapat menggunakan binding python apriltag yang dibuat oleh Duckietown.
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);
Disediakan oleh pihak ketiga di sini.
Disediakan oleh pihak ketiga di sini
Untuk sebagian besar kasus penggunaan ini harus menjadi penurunan penggantian.
Perhatikan bahwa perpustakaan ini tidak memiliki dependensi eksternal. Sebagian besar aplikasi akan membutuhkan, setidaknya, metode untuk memperoleh gambar.
Lihat Contoh/opencv_demo.cc untuk contoh menggunakan apriltag di C ++ dengan opencv. Contoh aplikasi ini dapat dibangun dengan mengeksekusi yang berikut:
$ cd examples
$ make opencv_demo
Data gambar dalam objek CV :: Mat dapat diteruskan ke apriltag tanpa membuat salinan yang dalam. Cukup buat header Image_U8_T untuk buffer data CV :: Mat:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
Meningkatkan parameter quad_decimate akan meningkatkan kecepatan detektor dengan biaya jarak deteksi. Jika Anda memiliki inti CPU tambahan untuk dilemparkan ke masalah maka Anda dapat meningkatkan nthread. Jika gambar Anda agak bising, meningkatkan parameter Quad_sigma dapat meningkatkan kecepatan.
Pertama pilih contoh gambar dan jalankan detektor dengan debug = 1 untuk menghasilkan gambar debug. Ini menunjukkan output detektor pada setiap langkah dalam pipa deteksi. Jika batas tag Anda tidak terdeteksi sebagai segi empat, kurangi quad_decimate (semua jalan ke 1 jika perlu). Jika batas tag terdeteksi maka bereksperimenlah dengan mengubah decode_sharpening.
Kami menyediakan metode untuk menghitung pose tag sebagai berikut (secara bergantian menggunakan pemecah PNP OpenCV dengan solvepnp_ippe_square). Anda perlu memasukkan file header apriltag_pose.h dan kemudian hubungi fungsi estimate_tag_pose sebagai berikut:
// 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.
...
Di mana parameternya sebagai berikut:
det
: Struct deteksi tag (april_detection_t).tagsize
: Ukuran tag dalam meter. Setiap desain tag memiliki perbatasan hitam dan perbatasan putih, tetapi beberapa desain memiliki perbatasan putih di bagian dalam dan beberapa memiliki perbatasan hitam di bagian dalam. Tagsize dengan demikian diukur dari tempat kedua perbatasan bertemu, lihat gambar di bawah ini untuk contoh.fx
, fy
: Panjang fokus kamera (dalam piksel). Untuk sebagian besar kamera fx
dan fy
akan sama atau hampir demikian.cx
, cy
: Pusat fokus kamera (dalam piksel). Untuk sebagian besar kamera ini akan kira -kira sama dengan pusat gambar.Catatan: Ukuran tag tidak boleh diukur dari luar tag. Ukuran tag didefinisikan sebagai jarak antara sudut deteksi, atau secara bergantian, panjang tepi antara perbatasan putih dan batas hitam. Ilustrasi berikut menandai sudut deteksi dengan XS merah dan ukuran tag dengan panah merah untuk tag dari keluarga tag 48h12custom.
Sistem koordinat memiliki asal di pusat kamera. Poin sumbu Z dari pusat kamera di luar lensa kamera. Sumbu x ada di sebelah kanan pada gambar yang diambil oleh kamera, dan Y turun. Bingkai koordinat tag dipusatkan di tengah tag, dengan sumbu x ke kanan, sumbu-y ke bawah, dan sumbu-z ke dalam tag.
Anda dapat mengaktifkan alamat ADamat untuk men -debug masalah memori untuk pembuatan debug dengan menetapkan opsi ASAN
:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
Sebagian besar Anda kemudian dapat menjalankan executable Anda seperti biasa dan memeriksa output sanitiser. Jika Anda mendapatkan pesan seperti 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.
Anda harus memulai libasan.so.5
yang sesuai seperti ini:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.5 ./build/opencv_demo
Apriltag 3 mendukung berbagai tata letak tag yang mungkin di samping tata letak klasik yang didukung di apriltag 2. Bit data tag sekarang dapat pergi ke luar batas tag, dan juga dimungkinkan untuk mendefinisikan tata letak dengan "lubang" di dalam tag di dalam tag Perbatasan di mana tidak ada bit data. Dalam repo ini kami telah menyertakan:
Anda dapat menghasilkan keluarga tag Anda sendiri menggunakan repo kami yang lain, generasi apriltag.
Harap buat masalah di github ini untuk pertanyaan apa pun alih -alih mengirim pesan pribadi. Ini memungkinkan orang lain dengan pertanyaan yang sama untuk menemukan jawaban Anda.