Apriltag هو نظام إدفيري بصري شائع في أبحاث الروبوتات. يحتوي هذا المستودع على أحدث إصدار من Apriltag ، Apriltag 3 ، والذي يتضمن كاشف أسرع (> 2x) ، ومعدل الكشف المحسن على العلامات الصغيرة ، وتخطيطات العلامات المرنة ، وتقدير الوضع. يتكون Apriltag من مكتبة C صغيرة مع الحد الأدنى من التبعيات.
يمكنك العثور على صور العلامات للتخطيطات التي تم إنشاؤها مسبقًا هنا. نوصي باستخدام تخطيط tagstandard41h12.
Apriltag هو موضوع الأوراق التالية.
Apriltag: نظام إدفيري بصري قوي ومرن
Apriltag 2: الكشف الكفاءة والقوية الائتمانية
تخطيطات مرنة للعلامات الائتمانية
من الناحية الرسمية ، يتم دعم أنظمة تشغيل Linux فقط ، على الرغم من أن المستخدمين حققوا تركيبهم على Windows أيضًا.
سيقوم التثبيت الافتراضي بوضع رؤوس في/usr/محلي/تشمل ومشتركة مكتبة في/usr/local/lib. يقوم أيضًا بتثبيت برنامج نصي PKG-Config إلى/usr/local/lib/pkgconfig وسيقوم بتثبيت غلاف python إذا تم تثبيت python3.
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
سيؤدي ذلك إلى إنشاء مكتبات مشتركة (*. لذا) افتراضيًا. إذا كنت بحاجة إلى مكتبات ثابتة (*.A) تم تعيين BUILD_SHARED_LIBS
إلى OFF
:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build --target install
إذا كان لديك Ninja ( sudo apt install ninja-build
) مثبتة ، يمكنك استخدام:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
لتوليد وتجميع عبر نينجا بناء البرنامج النصي. سيكون أسرع بكثير من مولد Makefile الافتراضي لـ Cmake.
يمكنك حذف --target install
إذا كنت تريد فقط استخدام هذا محليًا دون التثبيت.
بالنسبة للغالبية العظمى من التطبيقات ، ستكون عائلة tagstandard41h12 هي الخيار الصحيح. يمكنك العثور على الصور للعلامات الموجودة في repl-IMGS repo. قم بزيادة الصور في المحرر المفضل لديك وطباعتها.
بعض الاستدلال لموعد اختيار عائلات العلامات الأخرى:
إذا لم يناسب أي من هذه احتياجاتك ، فقم بإنشاء عائلة العلامة المخصصة الخاصة بك هنا.
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)
بالتناوب ، يمكنك استخدام روابط Python Apriltag التي تم إنشاؤها بواسطة 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);
المقدمة من الطرف الثالث هنا.
المقدمة من الطرف الثالث هنا
بالنسبة لمعظم حالات الاستخدام ، يجب أن يكون هذا انخفاضًا في الاستبدال.
لاحظ أن هذه المكتبة ليس لها تبعيات خارجية. ستتطلب معظم التطبيقات ، على الأقل ، طريقة للحصول على الصور.
انظر مثال/opencv_demo.cc للحصول على مثال على استخدام apriltag في C ++ مع OpenCV. يمكن بناء هذا المثال من خلال تنفيذ ما يلي:
$ cd examples
$ make opencv_demo
يمكن تمرير بيانات الصورة في كائن السيرة الذاتية :: MAT إلى Apriltag دون إنشاء نسخة عميقة. ما عليك سوى إنشاء رأس image_u8_t للسيرة الذاتية:
cv::Mat img;
image_u8_t img_header = { .width = img.cols,
.height = img.rows,
.stride = img.cols,
.buf = img.data
};
زيادة المعلمة Quad_Dective ستزيد من سرعة الكاشف بتكلفة مسافة الكشف. إذا كان لديك نوى إضافية لوحدة المعالجة المركزية لرميها في المشكلة ، فيمكنك زيادة nThReads. إذا كانت صورتك صاخبة إلى حد ما ، فإن زيادة معلمة Quad_sigma يمكن أن تزيد من السرعة.
اختر أولاً صورة مثال وقم بتشغيل الكاشف باستخدام Debug = 1 لإنشاء صور التصحيح. تُظهر هذه إخراج الكاشف في كل خطوة في خط أنابيب الكشف. إذا لم يتم الكشف عن حدود العلامة الخاصة بك باعتبارها رباعي الأضلاع ، فقم بتقليل Quad_Deciment (وصولاً إلى 1 إذا لزم الأمر). إذا تم اكتشاف حدود العلامة ، فحين تجربة تغيير decode_sharpening.
نحن نقدم طريقة لحساب وضع العلامة على النحو التالي (استخدم بالتناوب PNP Solver من OpenCV مع solvepnp_ippe_square). ستحتاج إلى تضمين ملف رأس apriltag_pose.h ثم استدعاء وظيفة intivate_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
: The Tag Detection Struct (April_Detection_T).tagsize
: حجم العلامة بالأمتار. كل تصميم علامة له حدود سوداء وحدود بيضاء ، ولكن بعض التصميمات لها الحدود البيضاء من الداخل وبعضها لها الحدود السوداء من الداخل. وبالتالي يتم قياس العلامات من حيث يجتمع الحدود ، انظر الشكل أدناه للحصول على مثال.fx
، fy
: طول البؤرة للكاميرا (بالبكسل). بالنسبة لمعظم الكاميرات fx
و fy
ستكون متساوية أو تقريبًا.cx
، cy
: مركز البؤرة للكاميرا (بالبكسل). بالنسبة لمعظم الكاميرات ، سيكون هذا هو نفس مركز الصور تقريبًا.ملاحظة: لا ينبغي قياس حجم العلامة من خارج العلامة. يتم تعريف حجم العلامة على أنه المسافة بين زوايا الكشف ، أو بالتناوب ، طول الحافة بين الحدود البيضاء والحدود السوداء. يمثل التوضيح التالي زوايا الكشف مع XS الأحمر وحجم العلامة مع سهم أحمر لعلامة من عائلة TAG 48H12CUSTOM.
نظام الإحداثيات له الأصل في مركز الكاميرا. يشير المحور Z من مركز الكاميرا خارج عدسة الكاميرا. المحور السيني هو إلى اليمين في الصورة التي التقطتها الكاميرا ، و y أسفل. يتركز إطار إحداثيات العلامة في وسط العلامة ، مع المحور السيني إلى اليمين ، المحور ص ، ومحور z في العلامة.
يمكنك تمكين العنوان المقلوب من تصحيح مشكلات الذاكرة لتصميم التصحيح عن طريق تحديد خيار ASAN
:
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. الحدود حيث لا توجد أجزاء بيانات. في هذا الريبو قمنا بتضمينه:
يمكنك إنشاء عائلات العلامات الخاصة بك باستخدام Generation repo-repiltag.
يرجى إنشاء مشكلة على هذا github لأي أسئلة بدلاً من إرسال رسالة خاصة. هذا يسمح للآخرين الذين لديهم نفس السؤال للعثور على إجابتك.