主要内容

使用APRILTAG标记相机校准

AprilTags被广泛应用于物体检测、定位和摄像机标定目标[1]。AprilTags类似于QR码,但设计的目的是编码更少的数据,因此可以更快地解码,这对实时机器人应用程序很有用。

此示例使用Readapriltag.功能,以检测和定位AprilTags在校准模式。的Readapriltag.函数支持所有官方标金宝app签族。该示例还使用其他计算机视觉工具箱™功能来执行端到端摄像机校准。默认的棋盘格模式被一个均匀间隔的AprilTags网格取代。有关使用棋盘模式进行校准的示例,请参阅单相机校准器应用

使用AprilTags作为校准模式的优点是:更鲁棒的特征点检测,一致性和可重复的检测。这个例子还可以作为使用其他自定义校准模式的模板,例如圆形的字段,而不是典型的棋盘模式。

步骤1:生成校准模式

下载并准备标记图像

为所有受支持的家庭预先生成的标签可以从金宝app这里使用网页浏览器或运行以下代码:

downloadurl =.“https://github.com/AprilRobotics/apriltag-imgs/archive/master.zip”;dataFolder = fullfile (tempdir,“apriltag-imgs”, filesep);选择= weboptions (“超时”、正);zipFileName = [dataFolder,'aprailtag-imgs-master.zip'];folderExists =存在(dataFolder,'dir');%在临时目录中创建一个文件夹来保存下载的文件如果~ folderExists mkdir (dataFolder);disp (下载apriltag-imgs-master.zip (60.1 MB)…) websave(zipFileName, downloadURL, options);%提取下载文件的内容disp (“提取apriltag-imgs-master.zip…”)解压缩(zipfilename,datafolder);结束
下载apriltag-imgs-master.zip (60.1 MB)…
提取apriltag-imgs-master.zip……

helperGenerateAprilTagPattern函数可以用于生成使用标记图像的特定标记的校准目标。模式映像包含在克里布特纳,可用于打印模式(来自MATLAB)。该示例使用tag36h11家庭,在检测性能和鲁棒性对假阳性检测之间提供合理的权衡。

%设置校准模式的属性。tagArrangement =(5、8);tagFamily =“tag36h11”;%使用AprilTags生成校准模式。tagImageFolder = [dataFolder“apriltag-imgs-master /”tagFamily];imdsTags = imageDatastore (tagImageFolder);calibPattern = helperGenerateAprilTagPattern(imdsTags, tagArrangement, tagFamily);

使用Readapriltag.此模式上的功能导致与分组一起分组的各个标签的角位置的检测。的HelperapriltagtoCheckerlocations.函数可用于将此排列转换为类似于棋盘格的以列为主的排列。

%读取和本地化校准模式中的标签。[tagIds, tagLocs] = readAprilTag(calibPattern, tagFamily);%根据其ID值对标记进行排序。[〜,sortIdx] =排序(标记);taglocs = taglocs(:,sortidx);将标签角的位置重塑为m × 2数组。tagLocs =重塑(permute(tagLocs,[1,3,2]), [], 2);%转换AprilTag角落位置为棋盘角落位置。checkerIdx = helperAprilTagToCheckerLocations (tagArrangement);imagePoints = tagLocs (checkerIdx (:):);%显示角落位置。图;imshow (calibPattern);持有情节(imagePoints (: 1) imagePoints (:, 2),'ro-''Markersize'15)

准备图像进行校准

生成的校准模式必须打印在平面上,需要校准的摄像机用于捕获该模式的图像。准备图像进行校准时需要注意的几点:

  • 在这个例子中,当图案被打印在一张纸上时,考虑打印在一个保持平坦的表面上,并且不会因潮湿等原因而变形。

  • 由于定标过程假定图形是平面的,因此图形中的任何缺陷(例如。表面不平)会降低校准的精度。

  • 校准过程需要至少2张模式图像,但使用10到20张图像会产生更准确的结果。

  • 捕捉模式的各种图像,使模式填充图像的大部分,从而覆盖整个视场。例如,为了最好地捕捉透镜畸变,在图像帧的所有边缘都有该模式的图像。

  • 确保模式在捕获的图像中完全可见,因为具有部分可见模式的图像将被拒绝。

  • 有关准备校准模式图像的更多信息,准备模式,相机和图像

步骤2:检测和本地化AprilTags

helperDetectAprilTagCorners包含在示例末尾的功能用于从捕获的图像检测和本地化标签,并将其排列在棋盘时尚中以用作校准过程中的关键点。

%创建IMAGEDATASTORE对象以存储捕获的图像。imdscalib = imagedataStore(“aprilTagCalibImages /”);%从图像中检测校准模式。[ImagePoints,BoardSize] = HelperDetectapRiltagcorners(IMDScalib,Tagarrandement,Tagfamily);

第3步:为校准模式生成世界要点

生成的apltag模式是使标签位于棋盘时尚,因此世界坐标用于上面确定的相应图像坐标(在imagePoints)可以使用使用generatecheckerboardpoint函数。

这里,正方形的大小被标签的大小所代替,而板子的大小是由上一步得到的。测量标签一侧的黑色外边缘之间的标签尺寸。

%为模式生成世界点坐标。tagSize = 16;%以毫米WorldPoints = GenerateCheckerboardPoint(BoardSize,标签);

步骤4:估计摄像机参数

与图像和世界点对应,估计相机参数使用estimateCameraParameters函数。

%确定图像的大小。I = readimage(imdsCalib, 1);imageSize = [size(I,1), size(I,2)];%估计相机参数。params = estimatecamerparameters (imagePoints, worldPoints,'图片大小', 图片大小);

在捕获的图像中可视化标定的准确性和显示标定模式平面的外部摄像机参数。

%显示重投影错误。图showReprojectionErrors (params)

%显示外部特性。图showExtrinsics (params)

检查被检测图像点的位置和使用估计的摄像机参数获得的重投影点。

%读取校准图像。i = ReadImage(IMDScalib,10);%为检测到的和重新投影的点插入标记。I = insertMarker(I, imagePoints(:,:,10),'o''颜色'‘g’“大小”5);i = InsertMarker(i,params.reprojectedpoints(:,10),“x”'颜色'“r”“大小”5);%显示图像。图imshow(我)

使用其他校准模式

虽然这个例子在校准模式中使用了AprilTags标记,但是同样的工作流也可以扩展到其他平面模式。的estimateCameraParameters用于获取相机参数需要:

  • imagePoints:从采集图像获得的图像坐标中,标定模式中的关键点。

  • 世界观点:标定模式中各关键点对应的世界点坐标。

如果有一种方法可以获得这些关键点,其余的校准工作流程保持不变。

金宝app支持功能

helperGenerateAprilTagPattern生成基于APRILTAG的校准模式。

功能calibri = helperGenerateAprilTagPattern(imdsTags, tagarrage, tagFamily) numTags = tagarrage (1)* tagarrage (2);numTags tagIds = 0 (1);%读取第一图像。I = readimage(imdsTags, 3);Igray = im2gray(我);%缩放缩略图标记图像。Ires = imresize(Igray, 15,'最近');%检测标签ID和位置(在图像坐标中)。[tagIds(1), tagLoc] = readAprilTag(Ires, tagFamily);%填充带有白色边界的图像(确保标签替换黑色%的部分棋盘)。tagsize = round(max(tagloc(:,2)) -  min(tagloc(:,2)));PADSIZE =圆形(标签/ 2  - (尺寸(IRES,2) -  TAGSIZE)/ 2);IRES = PADARRAY(IRES,[PADSIZE,PADSIZE],255);%初始化Tagimages数组以保存缩放标记。tagImages = 0 (size(Ires,1), size(Ires,2), numTags);tagImages(:,: 1) =忿怒;idx = 2:numTags I = readimage(imdsTags, idx + 2);Igray = im2gray(我);Ires = imresize(Igray, 15,'最近');IRES = PADARRAY(IRES,[PADSIZE,PADSIZE],255);Tagids(IDX)= ReadapRiltag(IRES,Tagfamily);%存储标签图像。tagImages (:,:, idx) =忿怒;结束%根据标签图像的id对其进行排序。[〜,sortIdx] =排序(标记);tagimages = tagimages(:,:,sortIdx);重塑标签图像,以确保它们以列为主顺序出现%(蒙太奇功能将图像按行主序排列)。columnMajIdx =重塑(1:numTags, tagarrangement)';tagImages = tagImages (:,:, columnMajIdx (:));%使用“蒙太奇”创建模式。imgdata = montage(tagimages,“大小”,标签);Calibpattern = imgdata.cdata;结束

helperDetectAprilTagCorners检测图像中的ApRIGRAG校准模式。

功能[ImagePoints,BoardSize,Imageused] = HelperDetectapRiltagcorners(IMDScalib,Tagarrandement,Tagfamily)%从TagArrandement获取图案大小。BoardSize = Tagarrandement * 2 + 1;%初始化图像和标签的数量。NumImages = Length(IMDScalib.files);numtags = tagarrangement(1)*标签(2);%初始化APRIGRAG模式中的角数。imagePoints = 0 (numTags * 4 2 numImages);imagesUsed = 0 (1, numImages);从AprilTag角获取棋盘的角索引。checkerIdx = helperAprilTagToCheckerLocations (tagArrangement);idx = 1: numImages%读取和检测图像中的AprilTags。I = readimage(imdsCalib, idx);[tagIds, tagLocs] = readAprilTag(I, tagFamily);如果检测到所有标记,则接受图像。如果numel(tagids)== numtags%使用ID值对检测到的标记进行排序。[〜,sortIdx] =排序(标记);taglocs = taglocs(:,sortidx);%重塑标签角落位置到MY-2数组中。tagLocs =重塑(permute(tagLocs,[1,3,2]), [], 2);%使用棋盘角落索引填充imagePoints。imagePoints (:,:, idx) = tagLocs (checkerIdx (:):);imagesUsed (idx) = true;其他的imagePoints (:,:, idx) = [];结束结束结束

HelperapriltagtoCheckerlocations.将AprilTag角转换为棋盘角。

功能checkerIdx = helperAprilTagToCheckerLocations(tagArrangement) numTagRows = tagArrangement(1);numTagCols = tagArrangement (2);numTagRows = numTagCols;%行索引偏移量。rowIdxOffset = [0:numTagRows - 1;0: numTagRows - 1];板中第一列和第二列的%行索引。col1Idx = repmat([4 1]', numTagRows, 1);col2Idx = repmat([3 2]', numTagRows, 1);col1Idx = col1Idx + rowIdxOffset(:)*4;col2Idx = col2Idx + rowIdxOffset(:)*4;%列索引偏移colIdxOffset = 0:4*numTagRows:numTags*4 - 1;%隐式展开,按顺序得到所有索引。checkerIdx = [col1idx; col2idx] + colidxoffset;结束

参考

E. Olson,“AprilTag:一个健壮而灵活的视觉基准系统,”2011 IEEE机器人与自动化国际会议引用本文:张海涛,张海涛,2011,pp. 3400-3407, doi: 10.1109/ICRA.2011.5979561。