주요 콘텐츠

readAprilTag

영상에서 AprilTag 검출 및 자세 추정

설명

[id,loc] = readAprilTag(I)는 입력 영상 I에서 AprilTag를 검출하고 해당 태그의 위치와 ID를 반환합니다.

예제

[id,loc] = readAprilTag(I,tagFamily)는 지정된 패밀리 tagFamily의 AprilTag만 검출합니다.

[___,pose] = readAprilTag(___,intrinsics,tagSize)는 위에 열거된 구문의 인수 조합을 포함하여 지정된 카메라 내부 파라미터 intrinsics와 태그 크기 tagSize를 기준으로 태그의 자세를 반환합니다.

[___,detectedFamily] = readAprilTag(___)는 인식된 AprilTag 패밀리 detectedFamily를 반환합니다.

[___] = readAprilTag(___,Name=Value)는 하나 이상의 이름-값 인수를 사용하여 옵션을 지정합니다. 예를 들어, GaussianSigma=2는 2차원 가우스 평활화 커널의 표준편차를 2로 설정합니다.

예제

모두 축소

영상을 작업 공간으로 읽어 들입니다.

I = imread("aprilTagsMulti.jpg");

영상에서 검색할 AprilTag 형식을 지정합니다.

tagFamily = ["tag36h11","tagCircle21h7","tagCircle49h12","tagCustom48h12","tagStandard41h12"];

영상에서 태그와 태그 위치를 검출하고 태그 ID를 읽습니다.

[id,loc,detectedFamily] = readAprilTag(I,tagFamily);

for idx = 1:length(id)
        % Display the ID and tag family
        disp("Detected Tag ID, Family: " + id(idx) + ", " ...
            + detectedFamily(idx));
 
        % Insert markers to indicate the locations
        markerRadius = 8;
        numCorners = size(loc,1);
        markerPosition = [loc(:,:,idx),repmat(markerRadius,numCorners,1)];
        I = insertShape(I,"FilledCircle",markerPosition,ShapeColor="red",Opacity=1);
end
Detected Tag ID, Family: 30, tag36h11
Detected Tag ID, Family: 32, tagCircle21h7
Detected Tag ID, Family: 98, tagStandard41h12
Detected Tag ID, Family: 195, tagCustom48h12
Detected Tag ID, Family: 884, tagCircle49h12

검출된 태그의 코너 위치를 나타내는 마커와 함께 영상을 표시합니다.

imshow(I)

Figure contains an axes object. The hidden axes object contains an object of type image.

AprilTag가 포함된 영상을 작업 공간으로 읽어 들입니다. 영상을 표시합니다.

I = imread("aprilTag36h11.jpg");
imshow(I)

Figure contains an axes object. The hidden axes object contains an object of type image.

카메라 내부 파라미터를 불러옵니다.

data = load("camIntrinsicsAprilTag.mat");
intrinsics = data.intrinsics;  

태그 크기를 미터 단위로 지정합니다.

tagSize = 0.04;

카메라 내부 파라미터를 사용하여 입력 영상의 왜곡을 보정합니다.

I = undistortImage(I,intrinsics,OutputView="same");

특정 AprilTag 패밀리를 검출하고 태그 자세를 추정합니다.

[id,loc,pose] = readAprilTag(I,"tag36h11",intrinsics,tagSize);

좌표축 벡터와 태그 프레임의 원점을 설정합니다.

worldPoints = [0 0 0; tagSize/2 0 0; 0 tagSize/2 0; 0 0 tagSize/2];

영상에 태그 프레임과 ID를 추가합니다.

for i = 1:length(pose)
    % Get image coordinates for axes.
    imagePoints = world2img(worldPoints,pose(i),intrinsics);

    % Draw colored axes.
    I = insertShape(I,Line=[imagePoints(1,:) imagePoints(2,:); ...
        imagePoints(1,:) imagePoints(3,:); imagePoints(1,:) imagePoints(4,:)], ...
        ShapeColor=["red","green","blue"],LineWidth=7);

    I = insertText(I,loc(1,:,i),id(i),BoxOpacity=1,FontSize=25);
end

주석이 달린 영상을 표시합니다.

imshow(I)

Figure contains an axes object. The hidden axes object contains an object of type image.

입력 인수

모두 축소

입력 영상으로, M×N×3 트루컬러 영상 또는 M×N 회색조 영상으로 지정됩니다.

AprilTag 패밀리로, 다음 표에 나열된 하나 이상의 유효한 AprilTag 패밀리로 지정됩니다. 패밀리를 지정하면 검색을 제한하여 함수 실행 시간을 줄일 수 있습니다.

AprilTag 패밀리
"tag16h5"
"tag25h9"
"tag36h11"
"tagCircle21h7"
"tagCircle49h12"
"tagCustom48h12"
"tagStandard41h12"
"tagStandard52h13"

데이터형: char | string | cell

카메라 내부 파라미터로, cameraIntrinsics 객체로 지정됩니다.

태그 크기(밀리미터 등의 세계 단위)로, 양의 스칼라로 지정됩니다. 이 함수는 태그의 크기를 인접한 두 코너의 바깥쪽 검은색 가장자리 사이의 길이로 정의합니다.

이름-값 인수

모두 축소

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

예: readAprilTag(I,GaussianSigma=2)는 2차원 가우스 평활화 커널의 표준편차를 2로 설정합니다.

2차원 가우스 평활화 커널의 표준편차로, 음이 아닌 스칼라로 지정됩니다. 가우스 커널은 입력 영상을 평활화하여 백색 가우스 잡음을 줄입니다. 이 값을 늘리면 처리 속도는 높아지고 정밀도는 떨어집니다.

데시메이션 인자로, 양의 정수로 지정됩니다. 데시메이션 인자는 다운샘플링의 스케일을 제어합니다. 이 값을 늘리면 검출률은 높아지고 검출 거리는 줄어듭니다.

출력 인수

모두 축소

태그 ID로, 양의 정수로 구성된 벡터로 반환됩니다.

영상 내 태그 위치로, 4×2×N 배열로 반환됩니다. 이 배열에는 N개 태그의 4개 코너 각각의 (x,y) 위치가 포함됩니다.

카메라에 대한 태그의 자세로, rigidtform3d 객체로 구성된 배열로 반환됩니다. 각 객체는 tagSize 입력 인수와 동일한 세계 단위로 태그의 3차원 강체 변환을 캡슐화합니다. 각 태그 프레임의 원점은 해당 태그의 중심에 위치합니다. 태그 프레임의 X-Y 평면은 AprilTag가 놓여 있는 평평한 표면으로 정의되며, Z축은 태그 쪽을 향합니다.

검출된 태그 패밀리로, string형으로 구성된 벡터로 반환됩니다.

  • 거짓양성 검출을 최소화하면서 실시간 성능이 필요한 애플리케이션의 경우 "tag36h11" 패밀리 태그를 사용해 보십시오.

  • 지원되는 ID 개수보다 더 빠른 검출 시간이 필요한 애플리케이션의 경우 "tagStandard41h12" 패밀리 태그를 사용하십시오.

  • 지원되는 모든 태그 패밀리의 미리 생성된 태그는 Pregenerated AprilTag Images on GitHub를 참조하십시오.

  • readAprilTag 함수는 경계 비트 2개가 포함된 AprilTag를 읽을 수 없습니다.

확장 기능

모두 확장

버전 내역

R2020b에 개발됨

모두 확장