주요 콘텐츠

estimateCameraParameters

단일 또는 스테레오 카메라 보정

설명

[cameraParams,imagesUsed,estimationErrors] = estimateCameraParameters(imagePoints,worldPoints)는 단일 카메라와 스테레오 카메라의 내부 파라미터 및 외부 파라미터와 왜곡 계수의 추정값이 포함된 cameraParams 객체를 반환합니다. 이 함수는 카메라 파라미터 추정에 사용한 영상과 단일 카메라 보정에 대한 표준 추정 오차도 반환합니다. estimateCameraParameters 함수는 외부 파라미터와 내부 파라미터를 추정합니다.

예제

[stereoParams,pairsUsed,estimationErrors] = estimateCameraParameters(imagePoints,worldPoints)는 스테레오 카메라의 파라미터가 포함된 stereoParameters 객체인 stereoParams를 반환합니다. 이 함수는 스테레오 파라미터 추정에 사용한 영상과 스테레오 카메라 보정에 대한 표준 추정 오차도 반환합니다.

예제

cameraParams = estimateCameraParameters(___,Name=Value)는 위에 열거된 구문에 나와 있는 인수 조합 외에, 하나 이상의 이름-값 인수를 사용하여 옵션을 지정합니다. 예를 들어, WorldUnits="mm"는 세계 단위를 밀리미터로 설정합니다.

예제

예제

모두 축소

보정 영상 세트를 만듭니다.

imds = imageDatastore(fullfile(toolboxdir('vision'),'visiondata',...
            'calibration','mono'));
imageFileNames = imds.Files;

보정 패턴을 검출합니다.

[imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames);

사각형 코너의 세계 좌표를 생성합니다.

squareSizeInMM = 29;
worldPoints = patternWorldPoints("checkerboard",boardSize,squareSizeInMM);

카메라를 보정합니다.

I = preview(imds); 
imageSize = [size(I, 1),size(I, 2)];
params = estimateCameraParameters(imagePoints,worldPoints, ...
                                  'ImageSize',imageSize);

보정 정확도를 시각화합니다.

showReprojectionErrors(params);

Figure contains an axes object. The axes object with title Mean Reprojection Error per Image, xlabel Images, ylabel Mean Error in Pixels contains 3 objects of type bar, line. This object represents Overall Mean Error: 0.18 pixels.

카메라 외부 파라미터를 시각화합니다.

figure;
showExtrinsics(params);

Figure contains an axes object. The axes object with title Extrinsic Parameters Visualization, xlabel X (mm), ylabel Z (mm) contains 23 objects of type patch, text, line.

drawnow;

검출되고 재투영된 점을 플로팅합니다.

figure; 
imshow(imageFileNames{1}); 
hold on;
plot(imagePoints(:,1,1), imagePoints(:,2,1),'go');
plot(params.ReprojectedPoints(:,1,1),params.ReprojectedPoints(:,2,1),'r+');
legend('Detected Points','ReprojectedPoints');
hold off;

Figure contains an axes object. The hidden axes object contains 3 objects of type image, line. One or more of the lines displays its values using only markers These objects represent Detected Points, ReprojectedPoints.

보정 영상을 지정합니다.

leftImages = imageDatastore(fullfile(toolboxdir("vision"),"visiondata", ...
    "calibration","stereo","left"));
rightImages = imageDatastore(fullfile(toolboxdir("vision"),"visiondata", ...
    "calibration","stereo","right"));

체커보드를 검출합니다.

[imagePoints,boardSize] = ...
  detectCheckerboardPoints(leftImages.Files,rightImages.Files);

체커보드 키포인트의 세계 좌표를 지정합니다. 사각형 크기의 단위는 밀리미터입니다.

squareSize = 108;
worldPoints = patternWorldPoints("checkerboard",boardSize,squareSize);

스테레오 카메라 시스템을 보정합니다. 두 카메라의 해상도는 같습니다.

I = readimage(leftImages,1); 
imageSize = [size(I,1) size(I,2)];
params = estimateCameraParameters(imagePoints,worldPoints, ...
    "ImageSize",imageSize);

보정 정확도를 시각화합니다.

showReprojectionErrors(params)

Figure contains an axes object. The axes object with title Mean Reprojection Error per Image, xlabel Image Pairs, ylabel Mean Error in Pixels contains 5 objects of type bar, line. These objects represent Camera 1, Camera 2, Overall Mean Error: 0.06 pixels.

카메라 외부 파라미터를 시각화합니다.

figure
showExtrinsics(params)

Figure contains an axes object. The axes object with title Extrinsic Parameters Visualization, xlabel X (mm), ylabel Z (mm) contains 28 objects of type patch, text, line.

구조체로 변환합니다.

paramsStruct = toStruct(params)
paramsStruct = struct with fields:
       CameraParameters1: [1×1 struct]
       CameraParameters2: [1×1 struct]
       RotationOfCamera2: [3×3 double]
    TranslationOfCamera2: [-119.8720 -0.4005 -0.0258]
                 Version: [1×1 struct]
     RectificationParams: [1×1 struct]

보정 영상 세트를 만듭니다.

imds = imageDatastore(fullfile(toolboxdir('vision'),'visiondata',...
                        'calibration','circleGrid','mono'));
calibrationImages = readall(imds);
calibrationImages = cat(4,calibrationImages{:});

원 그리드 패턴의 크기를 정의합니다.

patternDims = [8 11];

보정 영상에서 패턴을 검출합니다.

imagePoints = detectCircleGridPoints(calibrationImages, patternDims,...
                        'PatternType','symmetric');

원 그리드 키포인트의 세계 좌표를 지정합니다. 중심 거리의 단위는 밀리미터입니다.

centerDistance = 18;
worldPoints = patternWorldPoints('circle-grid-symmetric',patternDims,centerDistance);

보정 영상을 사용하여 카메라를 보정합니다.

imageSize = size(calibrationImages,1:2);
params = estimateCameraParameters(imagePoints,worldPoints,...
                        'ImageSize',imageSize);

검출된 패턴 그리드와 재투영된 점을 플로팅합니다.

figure
imshow(calibrationImages(:,:,:,1))
hold on
plot(imagePoints(:,1,1), imagePoints(:,2,1),'gx','MarkerSize',8)
plot(params.ReprojectedPoints(:,1,1),params.ReprojectedPoints(:,2,1),'r+','MarkerSize',8)
legend('Detected Points','ReprojectedPoints')
hold off

Figure contains an axes object. The hidden axes object contains 3 objects of type image, line. One or more of the lines displays its values using only markers These objects represent Detected Points, ReprojectedPoints.

입력 인수

모두 축소

보정 패턴의 키포인트로, [x,y] 내부 영상 좌표로 구성된 배열로 지정됩니다.

보정[x,y] 키포인트로 구성된 입력 배열
단일 카메라

[x,y] 점으로 구성된 M×2×numImages 배열.

  • 영상 개수 numImages는 2보다 크거나 같아야 합니다.

  • 각 패턴에 포함된 키포인트 좌표 개수 M은 3보다 커야 합니다.

부분적으로 검출된 패턴은 단일 카메라 보정에서만 지원됩니다. 추정값에 부분적으로 검출된 패턴을 포함하려면 누락된 키포인트의 x-y 좌표로 [NaN,NaN]을 사용합니다.

스테레오 카메라

[x,y] 점으로 구성된 M×2×numPairs×2 배열.

  • numPairs는 보정 패턴을 포함하는 스테레오 영상 쌍의 개수입니다. 2보다 커야 합니다.

  • 각 패턴에 포함된 키포인트 좌표 개수 M은 3보다 커야 합니다.

  • imagePoints(:,:,:,1)은 카메라 1의 점입니다.

  • imagePoints(:,:,:,2)는 카메라 2의 점입니다.

데이터형: single | double

세계 좌표에서 보정 패턴의 키포인트로, M개의 [x,y] 세계 좌표로 구성된 M×2 배열로 지정됩니다. 패턴은 평면이어야 하므로 z 좌표는 0입니다. 보정 영상은 동일평면상에 있지 않아야 합니다. 공간 평면당 하나의 보정 영상만 사용하십시오.

데이터형: single | double

이름-값 인수

모두 축소

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: "WorldUnits","mm"는 세계 좌표 점 단위를 밀리미터로 설정합니다.

세계 좌표 점 단위로, 문자형 벡터 또는 string형 스칼라로 지정됩니다.

왜도 추정 여부로, 논리형 스칼라로 지정됩니다. 이 속성을 true로 설정하면 함수는 영상 좌표축 왜도를 추정합니다. false로 설정하면 영상 좌표축이 정확히 수직이 되고 함수는 왜도를 0으로 설정합니다.

추정할 방사 왜곡 계수의 개수로, 값 2 또는 3으로 지정됩니다.

방사 왜곡은 주점에서 확장되는 방사형 선을 따라 영상 점이 변위되는 것입니다.

  • 영상 점이 주점에서 멀어질수록(양의 방사형 변위) 영상 배율이 감소하고 영상에 핀쿠션 왜곡이 발생합니다.

  • 영상 점이 주점에 가까워질수록(음의 방사형 변위) 영상 배율이 증가하고 영상에 배럴 왜곡이 발생합니다.

Three grids that each represent a type of distortion. One with pincushion distortion (positive radial displacement), one with no distortion, and one with barrel distortion (negative radial displacement)

방사 왜곡 계수는 이러한 유형의 왜곡을 모델링합니다. 왜곡된 점은 (xdistorted, ydistorted)로 표기합니다.

xdistorted = x(1 + k1*r2 + k2*r4 + k3*r6)

ydistorted= y(1 + k1*r2 + k2*r4 + k3*r6)

  • x, y — 왜곡되지 않은 픽셀 위치입니다. xy는 정규화된 영상 좌표에 있습니다. 정규화된 영상 좌표는 픽셀 좌표를 광학적 중심으로 평행 이동하고 초점 거리(단위: 픽셀)로 나누는 방법으로 계산됩니다. 따라서 xy에는 차원이 없습니다.

  • k1, k2k3 — 렌즈의 방사 왜곡 계수입니다.

  • r2 = x2 + y2

일반적으로, 두 계수로 충분히 보정이 가능합니다. 광각 렌즈에서와 같이 심각한 왜도가 발생하는 경우에는 k3를 포함하여 3개 계수를 선택할 수 있습니다.

접선 왜곡 플래그로, 논리형 스칼라로 지정됩니다. 이 속성을 true로 설정하면 함수는 접선 왜곡을 추정합니다. false로 설정하면 접선 왜곡이 무시됩니다.

접선 왜곡은 렌즈와 영상 평면이 평행이 아닌 경우에 발생합니다. 접선 왜곡 계수는 이러한 유형의 왜곡을 모델링합니다.

Comparison of zero tangential distortion and tangential distortion

왜곡된 점은 (xdistorted, ydistorted)로 표기합니다.

xdistorted = x + [2 * p1 * x * y + p2 * (r2 + 2 * x2)]

ydistorted = y + [p1 * (r2 + 2 *y2) + 2 * p2 * x * y]

  • x, y — 왜곡되지 않은 픽셀 위치입니다. xy는 정규화된 영상 좌표에 있습니다. 정규화된 영상 좌표는 픽셀 좌표를 광학적 중심으로 평행 이동하고 초점 거리(단위: 픽셀)로 나누는 방법으로 계산됩니다. 따라서 xy에는 차원이 없습니다.

  • p1p2 — 렌즈의 접선 왜곡 계수입니다.

  • r2 = x2 + y2

카메라 내부 파라미터의 초기 추측값으로, 3×3 행렬로 지정됩니다. 행렬의 형식은 다음과 같습니다.

[fxscx0fycy001]

좌표 [cx cy]는 광학적 중심(주점)(단위: 픽셀)을 나타냅니다. x축과 y축이 정확히 수직일 때 왜도 파라미터 s0입니다.

fx = F*sx

fy = F*sy

  • F는 세계 단위의 초점 거리로, 일반적으로 밀리미터로 표현됩니다.

  • sxsy는 각각 x 방향과 y 방향의 세계 단위당 픽셀 개수입니다.

  • fxfy는 픽셀로 표현됩니다.

초기값을 제공하지 않으면 함수는 선형 최소제곱을 사용하여 초기 내부 행렬을 계산합니다.

방사 왜곡 계수의 초기 추측값으로, 요소를 2개 또는 3개 가진 벡터로 지정됩니다. 초기값을 제공하지 않으면 함수는 모든 계수의 초기값으로 0을 사용합니다.

카메라가 생성하는 영상 크기로, 1×2 [mrows, ncols] 벡터로 지정됩니다. 카메라 Intrinsics 속성값을 반환하려면 ImageSize 이름-값 인수를 지정해야 합니다.

출력 인수

모두 축소

카메라 파라미터로, cameraParameters 객체로 반환됩니다. ImageSize 이름-값 인수가 입력 시 지정되지 않은 경우 cameraParams 객체에는 Intrinsics 속성값이 포함되지 않습니다.

카메라 파라미터 추정에 사용되는 영상으로, numImages×1 논리형 배열로 반환됩니다. numImages는 영상 개수에 해당합니다. 이 배열은 카메라 파라미터 추정에 사용한 영상을 나타냅니다. 배열의 논리값 true는 해당 영상이 카메라 파라미터 추정에 사용되었음을 나타냅니다.

이 함수는 세계 좌표 점과 각 영상에서 검출된 점 간의 호모그래피를 계산합니다. 영상에 대한 호모그래피 계산에 실패하면 함수는 경고를 발생시킵니다. 해당 영상의 점은 카메라 파라미터 추정에 사용되지 않습니다. 또한 이 함수는 imagesUsed의 대응하는 요소를 false로 설정합니다.

추정된 파라미터의 표준 오차로, cameraCalibrationErrors 객체 또는 stereoCalibrationErrors 객체로 반환됩니다.

스테레오 시스템의 카메라 파라미터로, stereoParameters 객체로 반환됩니다. 이 객체는 스테레오 카메라 시스템의 내부 파라미터, 외부 파라미터, 렌즈 왜곡 파라미터를 포함합니다.

카메라 파라미터 추정에 사용되는 영상 쌍으로, numPairs×1 논리형 배열로 반환됩니다. numPairs는 영상 쌍의 개수에 해당합니다. 배열의 논리값 true는 해당 영상 쌍이 카메라 파라미터 추정에 사용되었음을 나타냅니다.

알고리즘

모두 축소

참고 문헌

[1] Zhang, Z. "A Flexible New Technique for Camera Calibration." IEEE Transactions on Pattern Analysis and Machine Intelligence 22, no. 11 (November 2000): 1330–34. https://doi.org/10.1109/34.888718.

[2] Heikkila, J., and O. Silven. “A Four-Step Camera Calibration Procedure with Implicit Image Correction.” In Proceedings of IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 1106–12. San Juan, Puerto Rico: IEEE Comput. Soc, 1997. https://doi.org/10.1109/CVPR.1997.609468.

[3] Bouguet, J.Y. “Camera Calibration Toolbox for Matlab”, Computational Vision at the California Institute of Technology.

[4] Bradski, G., and A. Kaehler. Learning OpenCV : Computer Vision with the OpenCV Library. Sebastopol, CA: O'Reilly, 2008.

버전 내역

R2014b에 개발됨

모두 확장