メインコンテンツ

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) は、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、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 のトゥルーカラー イメージまたは MN 列のグレースケール イメージとして指定します。

AprilTag ファミリ。次の表にリストされている 1 つ以上の有効な AprilTag ファミリとして指定します。ファミリを指定することにより、検索範囲を制限し、関数の実行時間を短縮できます。

AprilTag ファミリ
"tag16h5"
"tag25h9"
"tag36h11"
"tagCircle21h7"
"tagCircle49h12"
"tagCustom48h12"
"tagStandard41h12"
"tagStandard52h13"

データ型: char | string | cell

カメラの内部パラメーター。cameraIntrinsics オブジェクトとして指定します。

ワールド単位 (ミリメートルなど) でのタグのサイズ。正のスカラーとして指定します。関数は、タグのサイズを、外側の黒い縁の隣接する 2 つのコーナー間の長さとして定義します。

名前と値の引数

すべて折りたたむ

オプションの引数のペアを 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" ファミリ タグを使用します。

  • サポートされているすべてのタグ ファミリの事前生成済みのタグについては、GitHub の事前生成済み AprilTag イメージを参照してください。

  • readAprilTag 関数は、2 つの境界線ビットを含む AprilTag を読み取ることができません。

拡張機能

すべて展開する

バージョン履歴

R2020b で導入

すべて展開する