主要内容

本页采用了机器翻译。点击此处可查看英文原文。

readAprilTag

检测图像中的 AprilTag 并估计其位姿

说明

[id,loc] = readAprilTag(I) 会检测输入图像 I 中的 AprilTags,并返回与这些标记相关的位置和 ID。

示例

[id,loc] = readAprilTag(I,tagFamily) 仅检测指定族别 (tagFamily) 的 AprilTags。

[___,pose] = readAprilTag(___,intrinsics,tagSize) 返回标记相对于指定相机内参的位姿,intrinsics 以及标记的大小 tagSize,此外还支持前文所述语法中任意参量组合。

[___,detectedFamily] = readAprilTag(___) 返回已识别的 AprilTag 族,即 detectedFamily

[___] = readAprilTag(___,Name=Value) 使用一个或多个名称-值参量指定选项。例如,GaussianSigma=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.

将包含 AprilTags 的图像读入工作区。显示图像。

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");

检测特定族别的 AprilTags,并估计标记的位姿。

[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

二维高斯平滑核的标准差,指定为一个非负标量。高斯核会对输入图像进行平滑处理,以减少白高斯噪声。提高此值可加快处理速度,但会以牺牲精确率为代价。

抽取因子,指定为正整数。降采样因子控制着降采样的比例。增加此值可提高检测率,但会缩短检测距离。

输出参量

全部折叠

标记 ID,以正整数向量的形式返回。

图像中标记的位置,以一个 4×2×N 数组的形式返回。该数组包含 N 标记的四个角点的 (x,y) 位置。

标记相对于相机的位姿,以 rigidtform3d 对象数组的形式返回。每个对象封装了标记的三维刚体变换,其单位与 tagSize 参量相同。每个标记框的起始位置位于相应标记的中心。标记框架的 X-Y 平面由 AprilTag 所置的平面确定,其中 Z- 轴指向标记内部。

检测到的标记族,以字符串向量的形式返回。

提示

  • 对于既需要实时性能,又需将误报率降至最低的应用,建议考虑使用 "tag36h11" 族标记。

  • 对于那些更注重检测速度而非支持的 ID 数量的应用,请使用 "tagStandard41h12" 族标记。

  • 有关所有受支持标记族的预生成标记,请参阅 GitHub 上的预生成 AprilTag 图像

  • readAprilTag 函数无法读取包含 2 个边界位的 AprilTag。

扩展功能

全部展开

版本历史记录

在 R2020b 中推出

全部展开