主要内容

测量与校准相机平面对象

这个例子展示了如何衡量硬币的直径在世界单位使用单一校准相机。

概述

这个例子显示了如何校准相机,然后用它来测量平面物体的大小,如硬币。该方法的一个示例应用程序是一个传送带上测量零件的质量控制。

校准相机

相机标定是一个过程,估算镜头和图像传感器的参数。这些参数需要测量物体被相机。这个例子展示了如何通过编程来校准相机。或者,您可以调整相机使用cameraCalibrator应用程序。

校准相机,我们首先需要多个图像的校准模式从不同的角度。典型的校准模式是一个不对称的棋盘,一边包含偶数个方块,黑白两色,另含有奇数个方块。

模式必须贴在一个平面上,它应该在大约相同的距离相机你想测量对象。一个正方形的大小必须以世界单位,例如毫米,尽可能精确。在这个示例中,我们使用9的图像模式,但在实践中推荐使用10到20为精确校准图片。

准备校准图片

创建一个单元阵列校正图像的文件名。

numImages = 9;文件=细胞(1、numImages);i = 1:{我}= fullfile numImages文件(matlabroot,“工具箱”,“愿景”,“visiondata”,“校准”,“单反”sprintf (“图像% d.jpg”,我));结束%显示标定的图像放大倍数= 25;I = imread(文件{1});图;imshow(我“InitialMagnification”、放大);标题(一个校正图像的);

图包含一个坐标轴对象。坐标轴对象与标题的一个校正图像包含一个类型的对象的形象。

估计摄像机参数

%检测图像中的棋盘的角落。[imagePoints, boardSize] = detectCheckerboardPoints(文件);%生成的棋盘的角落的世界坐标% pattern-centric坐标系,在左上角(0,0)。squareSize = 29;%在毫米worldPoints = generateCheckerboardPoints (boardSize squareSize);%校准相机。图象尺寸=[(我,1),大小(我,2)];cameraParams = estimateCameraParameters (imagePoints worldPoints,“图象尺寸”、图象尺寸);%评估校准精度。图;showReprojectionErrors (cameraParams);标题(“Reprojection错误”);

图包含一个坐标轴对象。坐标轴对象标题Reprojection错误包含3酒吧,类型的对象。该对象代表总体平均误差:0.90像素。

条形图显示校准的准确性。每一栏显示了相应的均reprojection误差校正图像。reprojection错误是图像中的角点检测之间的距离,和相应的理想世界点投射到图像。

阅读对象的形象被测量

加载图像包含对象来衡量。这张照片包含校准模式,模式是在同一个平面上你想测量的对象。在本例中,模式和硬币都是在同一桌面。

或者,您可以使用两个单独的图片:一个包含模式,包含被测对象和其他。再一次,对象和模式必须在同一个平面上。此外,图像必须被完全相同的观点,这意味着必须固定在相机的地方。

imOrig = imread (fullfile (matlabroot“工具箱”,“愿景”,“visiondata”,“校准”,“单反”,“image9.jpg”));图;imshow (imOrig“InitialMagnification”、放大);标题(输入图像的);

图包含一个坐标轴对象。标题输入图像的坐标轴对象包含一个类型的对象的形象。

Undistort图像

使用cameraParameters对象删除镜头畸变的图像。这对精确测量是必要的。

%因为镜头介绍小变形,使用完整的输出视图来说明% undistored形象。如果我们使用默认的“相同”选项,这将是困难的%注意到任何原始图像相比的区别。注意到小黑的边界。[im, newOrigin] = undistortImage (imOrig cameraParams,“OutputView”,“全部”);图;imshow (im,“InitialMagnification”、放大);标题(“无畸变的图像”);

图包含一个坐标轴对象。轴与标题不失真图像对象包含一个类型的对象的形象。

注意,这个形象展品很少的透镜畸变。undistortion步骤更重要的是,如果你使用广角镜头,或者低端摄像头。

段硬币

在这种情况下,硬币在白色背景彩色。使用HSV的饱和度分量表示的图像部分。

%将图像转换为HSV颜色空间。imHSV = rgb2hsv (im);%得到饱和通道。饱和= imHSV (:: 2);%的阈值图像t = graythresh(饱和);imCoin =(饱和> t);图;imshow (imCoin“InitialMagnification”、放大);标题(“分段硬币”);

图包含一个坐标轴对象。坐标轴对象与标题分段硬币包含一个类型的对象的形象。

检测硬币

我们可以假设分割图像的两个最大的连接组件对应的硬币。

%找到连接组件。blobAnalysis = vision.BlobAnalysis (“AreaOutputPort”,真的,“CentroidOutputPort”假的,“BoundingBoxOutputPort”,真的,“MinimumBlobArea”,200,“ExcludeBorderBlobs”,真正的);(地区,盒子)= (blobAnalysis imCoin)步;%连接组件降序排列的区域[~,idx] =排序(地区,“下”);%得到最大的两个组件。盒=双(盒(idx (1:2),:));%减少对显示图像的大小。规模=放大/ 100;imDetectedCoins = imresize (im,规模);%插入标签的硬币。imDetectedCoins = insertObjectAnnotation (imDetectedCoins,“矩形”,规模*盒子,“一分钱”);图;imshow (imDetectedCoins);标题(“发现硬币”);

图包含一个坐标轴对象。坐标轴对象与标题发现硬币包含一个类型的对象的形象。

计算外在

映射点在图像坐标点在世界坐标系中,我们需要计算相机的旋转和翻译相对于校准模式。请注意,外在函数假设没有透镜畸变。在这种情况下imagePoints已发现的形象已经不失真undistortImage

%检测棋盘。[imagePoints, boardSize] = detectCheckerboardPoints (im);%调整imagePoints坐标系中表示%用于原始图像,之前不失真。这种调整%是兼容cameraParameters对象计算原始图像。imagePoints = imagePoints + newOrigin;%增加newOrigin imagePoints每一行%计算相机的旋转和翻译。[R t] =外在(imagePoints, worldPoints cameraParams);

测量第一个硬币

衡量我们第一枚硬币将左上角和右上角的角落边界框成世界坐标。然后我们在毫米计算它们之间的欧氏距离。请注意,实际的美国硬币的直径是19.05毫米。

%调整左上角落边界框的坐标系统的转变%由undistortImage输出视图的“完整”。这不会是%需要如果输出是相同的。调整点兼容%的cameraParameters原始图像。盒=盒+ (newOrigin, 0, 0);%补零添加宽度和高度%左上角和右上角的角落。box1 =双(盒(1:));imagePoints1 = [box1 (1:2);box1 (1) + box1 (3), box1 (2)];%的世界坐标worldPoints1 = pointsToWorld (cameraParams R t, imagePoints1);%计算硬币的直径的毫米。d = worldPoints1 (2:)——worldPoints1 (1:);diameterInMillimeters =函数(d (1)、d (2));流(测量直径的一分钱= % 0.2 f毫米\ n ',diameterInMillimeters);
测量直径一分钱= 19.00毫米

测量第二个硬币

测量第二个硬币一样第一个硬币。

%左上角和右上角的角落。box2 =双(盒(2:));imagePoints2 = [box2 (1:2);box2 (1) + box2 (3), box2 (2)];%来自世界图像应用逆变换worldPoints2 = pointsToWorld (cameraParams R t, imagePoints2);%计算硬币的直径的毫米。d = worldPoints2 (2:)——worldPoints2 (1:);diameterInMillimeters =函数(d (1)、d (2));流(测量直径的另一分钱= % 0.2 f毫米\ n ',diameterInMillimeters);
测量直径另一分钱= 18.86毫米

测量距离第一个硬币

除了测量硬币的大小,我们也可以从相机测量是多么遥远。

%计算中的第一个硬币图像的中心。center1_image = box1 (1:2) + box1 (3:4) / 2;%转换为世界坐标。center1_world = pointsToWorld (cameraParams R t, center1_image);%记得添加0 z坐标。center1_world = (center1_world 0);%计算与摄像机之间的距离。[~,cameraLocation] = extrinsicsToCameraPose (R, t);distanceToCamera =规范(center1_world - cameraLocation);流(“距离相机第一分钱= % 0.2 f毫米\ n ',distanceToCamera);
与相机的距离第一分钱= 719.52毫米

总结

这个例子展示了如何使用一个校准相机测量平面的物体。请注意,测量精确到0.2毫米。

引用

[1]z。一个灵活的摄像机标定的新方法。IEEE模式分析与机器智能,22(11):1330 - 1334年,2000年。