主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

キャリブレートされたカメラによる平等オブジェクトの测定



概要

この例では,カメラをキャリブレーションし,それを使ってコインなどの平面オブジェクトのサイズを測定する方法を説明します。この方法の応用例として,品質管理を目的とした,コンベヤーベルト上の部品の測定が挙げられます。

カメラのキャリブレーション

。方法を说明し。别别方法として,cameraCalibratorアプリアプリ使用してカメラをキャリブレーションすることもももできできますできでき

カメラのキャリブレーションを行うには,まずキャリブレーションパターンの複数のイメージを異なる角度から撮影する必要があります。一般的なキャリブレーションパターンは,1辺の方向に白黒の正方形が偶数個含まれ,もう1辺の方向には奇数個の正方形が含まれる,非対称のチェッカーボードです。

パターンは平等な面にられられ,カメラからの距离を测定対象オブジェクトと同じにしばなりませんになけれ形のサイズははででミリメートルなどのワールド単位ででだけだけなどのワールド単位でばません。このこの例でははパターンのイメージをつつ使ますますますがうにははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははははををははをををををを

キャリブレーションイメージの设备

キャリブレーションイメージのファイル名の细胞配列を作成します。

numimages = 9;files = cell(1,NumImages);i = 1:Numimages文件{i} = fullfile(matlabroot,'工具箱'“愿景”“visiondata”...“校准”“单反”sprintf (“图像% d.jpg”,我));结束%显示一个校准图像放大倍数= 25;I = imread(文件{1});图;imshow(我“InitialMagnification”、放大);标题(“其中一张校准图像”);

カメラパラメーターの推定

%检测图像中的棋盘角落。[imagePoints, boardSize] = detectCheckerboardPoints(文件);%生成棋盘角落的世界坐标%以图案为中心的坐标系,左上角(0,0)。Squaresize = 29;%以毫米worldPoints = generateCheckerboardPoints(boardSize, squareSize);校准相机。imageSize = [size(I, 1), size(I, 2)];cameraParams = estimatecamerparameters (imagePoints, worldPoints,...'图片大小', 图片大小);%评估校准精度。图;showReprojectionErrors (cameraParams);标题(“Reprojection错误”);

対応対応理念的なワールド座标点ととのですです。

測定するオブジェクトのイメージの読み取り

测定対象ののオブジェクトをを含むを読み込み読み込み読み込みを含んでででおりおりおりパターンははオブジェクトオブジェクトするするオブジェクトオブジェクト同じ面にありますこのありありありありありありありありありありありありありありありでででありででははでででではではででががががででははがががとでははがががとコインはががが同じとコインコインがががののコイン置かれています。

別の方法として,パターンを含むイメージと測定対象のオブジェクトを含むイメージという,2つの異なるイメージを使用することもできます。その場合もオブジェクトとパターンは同じ平面上になければなりません。また,イメージをまったく同一の視点から撮影する必要があるので,カメラは固定されていなければなりません。

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

イメージの歪み補正

cameraParametersオブジェクトを使用して,イメージからレンズ歪みを除去します。これは正確な測定を行うために必要です。

%镜头引入了很小的失真,使用“完整”输出视图来说明%图像未分解。如果我们使用默认的“相同”选项,那将是困难的%来注意与原始图像相比的任何差异。注意小的黑色边框。[im, newOrigin] = un畸变图像(imOrig, camerparams)'OutputView''满的');图;imshow(我,“InitialMagnification”、放大);标题('不朽的形象');

このイメージでのレンズ歪みはごくわずかであることに注意してください。広角レンズや低品質のWebカメラを使用する場合には,歪み補正の手順がより重要となります。

コインコインセグメント化

ここでは,色彩のついたコインが白を背景として置かれています。イメージのHSV表現の彩度成分を使用してコインを切り出します。

%将图像转换为HSV颜色空间。imHSV = rgb2hsv (im);%获取饱和通道。饱和度= imHSV(:,:, 2);%阈值图像t =曲线(饱和度);imcoin =(饱和> t);图;imshow(imcoin,“InitialMagnification”、放大);标题('分段硬币');

コインの検出

セグメント化されたイメージにある2つの最大の連結要素がコインに対応すると仮定できます。

%查找连接组件。blobAnalysis =愿景。BlobAnalysis ('AreaOutputport', 真的,...“CentroidOutputPort”假的,...'bandingboxoutputport', 真的,...'MiniplingBlobarea', 200,“ExcludeBorderBlobs”,真正的);[areas, boxes] = step(blobAnalysis, imCoin);%按区域降序排列连接组件[~, idx] = sort(area,“下”);得到两个最大的组件。Boxes = double(框(idx(1:2),:));%缩小图像的大小以供显示。秤=放大/ 100;IMDetectedCoins = Imresize(IM,Scale);%为硬币插入标签。IMDetectedCoins = InsertObjectAnnotation(IMDetectedCoins,'长方形'...规模*盒子,'一分钱');图;imshow(imdetectedcoins);标题(“发现硬币”);

外部パラメーターの計算

イメージ座標の点をワールド座標の点にマッピングするには,キャリブレーションパターンを基準としてカメラの回転と並進を計算する必要があります。関数外在ここここで点ててででくださいくださいではででではでででででではででではレンズはでundistortImageを使って既に歪み補正されたイメージ内でimagePointsが検出されています。

%检测棋盘。[ImagePoints,BoardSize] =侦探校验erboardPoints(IM);%调整imagePoints,以便它们在坐标系统中表示%在原始图像中使用,在它未被扭曲之前。这种调整%使其与为原始图像计算的camerparameters对象兼容。imagePoints = imagePoints + neworigin;%添加newororigin到imagePoints的每一行%计算相机的旋转和平移。[R, t] = extrinsics(imagePoints, worldPoints, cameraParams);

最初のコインの測定

最初のコインを測定するには,境界ボックスの左上と右上のコーナーをワールド座標に変換します。そして,その間のユークリッド距離をミリメートル単位で計算します。アメリカの1セント硬貨の実際の直径は19.05毫米であることに注意してください。

%调整边界框的左上角以进行坐标系统的移动%由输出视图为'full'的un畸变图像引起。这不是%需要输出'相同'。调整使得点兼容含有原始图像的Cameraparameters。盒子=盒子+ [neworigin,0,0];为Widht和Height添加%零填充%得到左上角和右上角。Box1 = double(boxes(1,:));imagePoints1 = [box1 (1:2);...BOX1(1)+ BOX1(3),BOX1(2)];%得到了角落的世界坐标worldPoints1 = pointsToWorld(camerparams, R, t, imagePoints1);用毫米计算硬币的直径。d = worldPoints1(2,:)  -  WorldPoints1(1,:);直径百分比=半径(D(1),D(2));fprintf('一便士的测量直径= %0.2f毫米\n',直径尺);
测量直径为一分钱= 19.00毫米

2番目のコインの测定

2套とと同じしししししししししします。

%得到左上角和右上角。Box2 = double(boxes(2,:));imagePoints2 = [box2 (1:2);...BOX2(1)+ BOX2(3),BOX2(2)];%应用图像到世界的逆变换worldPoints2 = pointsToWorld(camerparams, R, t, imagePoints2);用毫米计算硬币的直径。d = worldPoints2(2,:)  -  WorldPoints2(1,:);直径百分比=半径(D(1),D(2));fprintf('另一枚硬币的测量直径= %0.2f mm\n',直径尺);
另一枚硬币的测量直径= 18.85毫米

最初のコインまでの距離の測定

コインのサイズだけでなく,カメラからコインまでの距離も測定できます。

%计算图像中第一个硬币的中心。Center1_image = box1(1:2) + box1(3:4)/2;%转换为世界坐标。center1_world = pointsToWorld(camerparams, R, t, center1_image);记得添加0 z坐标。Center1_world = [Center1_world 0];%计算到相机的距离。[〜,核心系列] = utInsicstocamerapose(R,T);distancetocamera = norm(Center1_world  - 亚美陆热带);fprintf('从相机到第一个PENNY =%0.2F mm \ n'的距离...distanceToCamera);
距离相机到第一笔= 719.52 mm的距离

まとめ

この例では,キャリブレートされたカメラを使用して平面オブジェクトを測定する方法を説明しました。測定値が誤差0.2毫米以内の精度であったことに注意してください。

参考文献

[1] Z.张。一种灵活的相机校准技术。图案分析和机器智能的IEEE交易,22(11):1330-1334,2000。