Apriltag는 로봇 공학 연구에서 인기있는 시각적 기초 시스템입니다. 이 저장소에는 최신 버전의 Apriltag, Apriltag 3이 포함되어 있으며, 여기에는 더 빠른 (> 2x) 검출기, 작은 태그의 개선 된 탐지 속도, 유연한 태그 레이아웃 및 포즈 추정이 포함됩니다. Apriltag는 최소한의 종속성을 가진 작은 C 라이브러리로 구성됩니다.
사전 생성 레이아웃의 태그 이미지를 여기에서 찾을 수 있습니다. Tagstandard41H12 레이아웃을 사용하는 것이 좋습니다.
Apriltag는 다음 논문의 주제입니다.
Apriltag : 강력하고 유연한 시각적 계시 시스템
APRILTAG 2 : 효율적이고 강력한 신용 탐지
기준 태그에 대한 유연한 레이아웃
사용자는 Windows에서도 성공을 거두었지만 공식적으로 Linux 운영 체제 만 지원됩니다.
기본 설치에는 헤더가/usr/local/포함 및 공유 라이브러리를/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
Ninja ( sudo apt install ninja-build
)가 설치된 경우 사용할 수 있습니다.
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target install
Ninja 빌드 스크립트를 통해 생성 및 컴파일합니다. CMake의 기본 MakeFile 생성기보다 훨씬 빠릅니다.
설치하지 않고 로컬로만 사용하려는 경우 --target install
생략 할 수 있습니다.
대부분의 응용 프로그램의 경우 Tagstandard41H12 제품군이 올바른 선택이 될 것입니다. Apriltag-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)
또는 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);
제 3자가 여기에서 제공합니다.
제 3자가 여기에서 제공합니다
대부분의 유스 케이스의 경우 교체가 줄어 듭니다.
이 라이브러리에는 외부 종속성이 없습니다. 대부분의 응용 프로그램에는 이미지를 획득하는 방법이 필요합니다.
OpenCV와 함께 C ++에서 apriltag를 사용하는 예는 예제/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 헤더 파일을 포함시킨 다음 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
: 카메라의 초점 센터 (픽셀). 대부분의 카메라의 경우 이미지 센터와 거의 동일합니다.참고 : 태그 크기는 태그 외부에서 측정해서는 안됩니다. 태그 크기는 검출 코너 사이의 거리 또는 흰색 경계와 검은 색 경계 사이의 가장자리 길이로 정의됩니다. 다음 그림은 48H12CUSTOM 태그 패밀리의 태그에 대한 빨간색 화살표가있는 빨간색 XS의 감지 코너와 태그 크기를 표시합니다.
좌표계는 카메라 센터에서 원점이 있습니다. 카메라의 z 축은 카메라 렌즈를 중심으로합니다. x 축은 카메라가 찍은 이미지의 오른쪽에 있고 Y는 다운되었습니다. 태그의 좌표 프레임은 태그 중앙에 중앙에 있으며 x 축을 오른쪽에, y 축 아래로, z 축으로 태그에 흡수합니다.
ASAN
옵션을 설정하여 Debug Build의 메모리 문제를 디버그하는 주소 사료화를 할 수 있습니다.
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에서 지원되는 클래식 레이아웃 외에 다양한 가능한 태그 레이아웃을 지원합니다. 태그의 데이터 비트는 이제 태그 테두리를 벗어날 수 있으며 태그 내부에 "구멍"으로 레이아웃을 정의 할 수도 있습니다. 데이터 비트가없는 곳. 이 저장소에서 우리는 다음을 포함시켰다.
다른 저장소 인 Apriltag-Generation을 사용하여 자신의 태그 패밀리를 생성 할 수 있습니다.
개인 메시지를 보내는 대신 질문이 있으시면이 GitHub에 문제를 제기하십시오. 이를 통해 같은 질문을 가진 다른 사람들이 귀하의 답변을 찾을 수 있습니다.