Apriltag是一種在機器人研究中流行的視覺基準系統。該存儲庫包含最新版本的Apriltag Apriltag 3,其中包括更快(> 2X)檢測器,提高小標籤的檢測率,靈活的標籤佈局和姿勢估計。 Apriltag由一個小的C庫組成,其依賴性最小。
您可以在此處找到預先生成的佈局的標籤圖像。我們建議使用tagstandard41h12佈局。
Apriltag是以下論文的主題。
Apriltag:強大而靈活的視覺基準系統
APRILTAG 2:有效而健壯的基準檢測
信託標籤的靈活佈局
儘管用戶在Windows上也成功安裝了官方的Linux操作系統,但僅支持Linux操作系統。
默認安裝將在/usr/local/include庫中放置標題和/usr/local/lib中的共享庫。它還將pkg-config腳本安裝到/usr/local/lib/pkgconfig中,如果安裝了Python3,將安裝Python包裝器。
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
默認情況下,這將構建共享(*.so)庫。如果您需要靜態(*.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_demo.cc,以獲取與OpenCV中C ++中使用Apriltag的示例。可以通過執行以下操作來構建此示例應用程序:
$ 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參數可以提高速度。
首先選擇一個示例圖像並使用debug = 1運行檢測器以生成調試圖像。這些顯示了檢測管道中每個步驟的檢測器的輸出。如果標籤的邊框未被檢測為四邊形,請降低quad_decimate(如有必要,一直到1)。如果檢測到標籤的邊框,則嘗試更改DecoDe_sharpening。
我們提供了一種計算標籤姿勢如下的方法(或者,將OPENCV的PNP求解器與solvepnp_ippe_square一起使用)。您將需要包含apriltag_pose.h頭文件,然後撥打estimate_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
:標籤檢測結構(April_detection_t)。tagsize
:標籤的大小為米。每個標籤設計都有一個黑色邊框和一個白色邊框,但是有些設計的內部有白色邊框,有些設計在內部有黑色邊框。因此,標籤是從兩個邊界相遇的位置測量的,請參見下圖。fx
, fy
:相機的焦距(以像素為單位)。對於大多數相機, fx
和fy
幾乎相等。cx
, cy
:相機的焦點中心(以像素為單位)。對於大多數相機,這將與圖像中心大致相同。注意:標籤大小不應從標籤的外部測量。標籤大小定義為檢測角之間的距離,或者交替地,白色邊框和黑色邊框之間的邊緣長度。以下圖表標記了帶有紅色XS的檢測角和帶有紅色箭頭的標籤大小,用於48h12custom標籤家族的標籤。
坐標系在相機中心具有原點。 Z軸從相機中心指出相機鏡頭。 X軸位於相機拍攝的圖像中的右側,而y則降低。標籤的坐標幀以標籤的中心為中心,右側為X軸,y軸向下,z軸為標籤。
您可以通過設置ASAN
選項:
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DASAN=ON
cmake --build build
大多數情況下,您可以像往常一樣運行可執行文件,並檢查療程器的輸出。如果您收到諸如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中支持的經典佈局外,還支持各種可能的標籤佈局。沒有數據位的邊界。在此存儲庫中,我們包括:
您可以使用我們的其他倉庫生成自己的標籤家庭。
請在此Github上創建問題,以獲取任何問題,而不是發送私人消息。這允許其他有相同問題的人找到您的答案。