주요 콘텐츠

detectCheckerboardPoints

영상에서 체커보드 패턴 검출

설명

단일 영상 체커보드 검출

[imagePoints,boardSize] = detectCheckerboardPoints(I)는 단일 영상, 영상 세트 또는 스테레오 영상 쌍에서 체커보드 보정 패턴의 키포인트를 검출합니다. 이 함수는 검출된 점 imagePoints와 체커보드의 크기 boardSize를 반환합니다.

예제

[imagePoints,boardSize,imagesUsed] = detectCheckerboardPoints(imageFileNames)는 파일 이름으로 구성된 배열로 제공되는 입력 영상 세트에서 체커보드 패턴을 검출합니다.

[imagePoints,boardSize,imagesUsed] = detectCheckerboardPoints(images)는 회색조 또는 트루컬러 영상으로 구성된 배열로 제공되는 입력 영상 세트에서 체커보드 패턴을 검출합니다.

스테레오 쌍 체커보드 검출

[imagePoints,boardSize,pairsUsed] = detectCheckerboardPoints(imageFileNames1,imageFileNames2)는 파일 이름으로 구성된 셀형 배열로 제공되는 스테레오 영상 쌍에서 체커보드 패턴을 검출합니다.

[imagePoints,boardSize,pairsUsed] = detectCheckerboardPoints(images1,images2)는 회색조 또는 트루컬러 영상으로 구성된 배열로 제공되는 스테레오 영상 쌍에서 체커보드 패턴을 검출합니다.

선택적 인수

[imagePoints,boardSize,pairsUsed] = detectCheckerboardPoints(___,Name,Value)는 하나 이상의 Name,Value 쌍 인수로 지정된 추가 옵션을 사용합니다. 지정되지 않은 속성은 디폴트 값을 가집니다.

예제

모두 축소

GoPro 카메라의 보정 영상을 포함하는 imageDatastore를 생성합니다.

imds = imageDatastore(fullfile(toolboxdir('vision'),'visiondata','calibration','gopro'));

어안 렌즈 영상에 사용하기 적합한 'HighDistortion' 옵션을 사용하여 보정 패턴을 검출합니다.

[imagePoints,boardSize,imagesUsed] = detectCheckerboardPoints(imds.Files(1:4),'HighDistortion',true);

검출된 점을 표시합니다.

for i = 1:4
  % Read image
  I = readimage(imds, i);

  % Insert markers at detected point locations
  I = insertMarker(I, imagePoints(:,:,i), 'o', 'MarkerColor', 'red', 'Size', 10);

  % Display image
  subplot(2, 2, i);
  imshow(I);
end

Figure contains 4 axes objects. Hidden axes object 1 contains an object of type image. Hidden axes object 2 contains an object of type image. Hidden axes object 3 contains an object of type image. Hidden axes object 4 contains an object of type image.

체커보드 패턴을 포함하는 영상을 불러옵니다.

imageFileName = fullfile(toolboxdir('vision'),'visiondata','calibration','webcam','image4.tif');
I = imread(imageFileName);

체커보드 점을 검출합니다.

[imagePoints,boardSize] = detectCheckerboardPoints(I);

검출된 점을 표시합니다.

J = insertText(I,imagePoints,1:size(imagePoints,1));
J = insertMarker(J,imagePoints,'o','MarkerColor','red','Size',5);
imshow(J);
title(sprintf('Detected a %d x %d Checkerboard',boardSize));

Figure contains an axes object. The hidden axes object with title Detected a 7 x 10 Checkerboard contains an object of type image.

보정 영상의 파일 이름으로 구성된 셀형 배열을 생성합니다.

for i = 1:5
  imageFileName = sprintf('image%d.tif', i);
  imageFileNames{i} = fullfile(matlabroot,'toolbox','vision',...
       'visiondata','calibration','webcam',imageFileName);
end

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

[imagePoints,boardSize,imagesUsed] = detectCheckerboardPoints(imageFileNames, 'PartialDetections', false);

검출된 점을 표시합니다.

imageFileNames = imageFileNames(imagesUsed);
for i = 1:numel(imageFileNames)
  I = imread(imageFileNames{i});
  subplot(2, 2, i);
  imshow(I);
  hold on;
  plot(imagePoints(:,1,i),imagePoints(:,2,i),'ro');
end

스테레오 영상을 읽어 들입니다.

numImages = 4;
images1 = cell(1, numImages);
images2 = cell(1, numImages);
for i = 1:numImages
    images1{i} = fullfile(matlabroot,'toolbox','vision',...
        'visiondata','calibration','stereo','left',sprintf('left%02d.png',i));
    images2{i} = fullfile(matlabroot,'toolbox','vision',...
        'visiondata','calibration','stereo','right',sprintf('right%02d.png',i));
end

영상에서 체커보드를 검출합니다.

[imagePoints,boardSize,pairsUsed] = ...
    detectCheckerboardPoints(images1,images2);

images1의 점들을 표시합니다.

images1 = images1(pairsUsed);
figure;
for i = 1:numel(images1)
      I = imread(images1{i});
      subplot(2,2,i);
      imshow(I); 
      hold on; 
      plot(imagePoints(:,1,i,1),imagePoints(:,2,i,1),'ro');
end 
annotation('textbox',[0 0.9 1 0.1],'String','Camera 1',...
    'EdgeColor','none','HorizontalAlignment','center')

Figure contains 4 axes objects. Hidden axes object 1 contains 2 objects of type image, line. One or more of the lines displays its values using only markers Hidden axes object 2 contains 2 objects of type image, line. One or more of the lines displays its values using only markers Hidden axes object 3 contains 2 objects of type image, line. One or more of the lines displays its values using only markers Hidden axes object 4 contains 2 objects of type image, line. One or more of the lines displays its values using only markers

images2의 점들을 표시합니다.

images2 = images2(pairsUsed);
figure;
for i = 1:numel(images2)
      I = imread(images2{i});
      subplot(2, 2, i);
      imshow(I);
      hold on; 
      plot(imagePoints(:,1,i,2),imagePoints(:,2,i,2),'ro');
end 
annotation('textbox',[0 0.9 1 0.1],'String','Camera 2',...
    'EdgeColor','none','HorizontalAlignment','center')

Figure contains 4 axes objects. Hidden axes object 1 contains 2 objects of type image, line. One or more of the lines displays its values using only markers Hidden axes object 2 contains 2 objects of type image, line. One or more of the lines displays its values using only markers Hidden axes object 3 contains 2 objects of type image, line. One or more of the lines displays its values using only markers Hidden axes object 4 contains 2 objects of type image, line. One or more of the lines displays its values using only markers

입력 인수

모두 축소

입력 영상으로, M×N×3 트루컬러 또는 M×N 2차원 회색조로 지정됩니다. 입력 영상은 실수형 비희소(nonsparse) 형식이어야 합니다. 이 함수는 최소 4×4 정사각형 크기의 체커보드를 검출할 수 있습니다.

데이터형: single | double | int16 | uint8 | uint16 | logical

영상 파일 이름으로, N개의 파일 이름으로 구성된 요소를 N개 가진 셀형 배열로 지정됩니다.

카메라 1 영상의 파일 이름으로, N개의 파일 이름으로 구성된 요소를 N개 가진 셀형 배열로 지정됩니다. 이 배열에 포함된 영상은 imageFileNames2에 포함된 영상과 순서가 같아야 하며, 스테레오 쌍을 생성합니다.

카메라 2 영상의 파일 이름으로, N개의 파일 이름으로 구성된 요소를 N개 가진 셀형 배열로 지정됩니다. 이 배열에 포함된 영상은 imageFileNames1에 포함된 영상과 순서가 같아야 하며, 스테레오 쌍을 생성합니다.

영상으로, 회색조 또는 트루컬러 영상 세트를 포함하는 H×W×B×F 배열로 지정됩니다. 입력 차원은 다음과 같습니다.

H는 영상 높이를 나타냅니다.
W는 영상 너비를 나타냅니다.
B는 색 채널을 나타냅니다. 값 1은 회색조 영상을 나타내고, 값 3은 트루컬러 영상을 나타냅니다.
F는 영상 프레임 수를 나타냅니다.

카메라 1의 스테레오 쌍 영상으로, 회색조 또는 트루컬러 영상 세트를 포함하는 H×W×B×F 배열로 지정됩니다. 입력 차원은 다음과 같습니다.

H는 영상 높이를 나타냅니다.
W는 영상 너비를 나타냅니다.
B는 색 채널을 나타냅니다. 값 1은 회색조 영상을 나타내고, 값 3은 트루컬러 영상을 나타냅니다.
F는 영상 프레임 수를 나타냅니다.

카메라 2의 스테레오 쌍 영상으로, 회색조 또는 트루컬러 영상 세트를 포함하는 H×W×B×F 배열로 지정됩니다. 입력 차원은 다음과 같습니다.

H는 영상 높이를 나타냅니다.
W는 영상 너비를 나타냅니다.
B는 색 채널을 나타냅니다. 값 1은 회색조 영상을 나타내고, 값 3은 트루컬러 영상을 나타냅니다.
F는 영상 프레임 수를 나타냅니다.

이름-값 인수

모두 축소

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

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

예: 'MinCornerMetric', '0.15'

최소 코너 메트릭 임계값으로, 음이 아닌 스칼라로 지정됩니다. 영상에 잡음이 있거나 질감이 뛰어난 경우 거짓 코너 검출 수를 줄이려면 이 값을 늘립니다. 'HighDistortion' 속성을 false로 설정하면 함수는 디폴트 값을 0.15로 설정합니다. 'HighDistortion' 속성을 true로 설정하면 함수는 디폴트 값을 0.12로 설정합니다. 값을 낮추면 검출되는 코너 수가 증가합니다.

높은 수준의 왜곡 여부로, false 또는 true로 지정됩니다. 영상에 어안 카메라와 같은 광시야각 카메라에서 일반적으로 발생하는 높은 수준의 왜곡이 포함된 경우 'HighDistortion'true로 설정하십시오. 영상에 높은 수준의 왜곡이 없는 경우에는 'HighDistortion'false로 설정합니다. 'HighDistortion'true로 설정하면 영상 왜곡에 대한 복원력은 향상되지만 처리 속도는 느려집니다.

부분 검출 여부로, true 또는 false로 지정됩니다. 'PartialDetections'true로 설정하면 부분적으로 검출된 체커보드를 반환합니다. 이 함수는 누락된 키포인트 검출을 [NaN,NaN] 좌표로 채웁니다. 'PartialDetections'false로 설정하면 부분적으로 검출된 체커보드를 삭제합니다. 이 속성은 스테레오 영상 쌍에서는 무시됩니다.

출력 인수

모두 축소

검출된 체커보드 코너 좌표로, 단일 영상의 경우 M×2 행렬로 반환됩니다. 다중 영상의 경우 M×2×number of images 배열로 점이 반환됩니다. 스테레오 영상 쌍의 경우 이 함수는 M×2×number of pairs×number of cameras 배열로 점을 반환합니다.

스테레오 쌍의 경우, imagePoints(:,:,:,1)은 첫 번째 영상 세트의 점이고, imagePoints(:,:,:,2)는 두 번째 영상 세트의 점입니다. 출력값에는 M개의 [x y] 좌표가 포함됩니다. 각 좌표는 체커보드에서 정사각형 코너가 검출된 점을 나타냅니다. 함수가 반환하는 점의 개수는 검출된 정사각형의 개수를 나타내는 boardSize 값에 따라 결정됩니다. 이 함수는 서브픽셀 수준의 정확도로 점을 검출합니다.

이 함수는 다음과 같이 점의 개수 M을 계산합니다.

M = prod(boardSize-1).

체커보드를 검출할 수 없는 경우 다음과 같습니다.
imagePoints = []
boardSize = [0,0]

imageFileNames 입력을 지정하면 함수는 imagePointsM×2×N 배열로 반환할 수 있습니다. 이 배열에서 N은 체커보드가 검출된 영상의 개수를 나타냅니다. 체커보드를 검출할 수 없는 경우, 함수는 imagePoints[]로 설정합니다.

단일 카메라 영상에만 해당:

  • 전체 체커보드를 검출할 수 없는 경우, 함수는 imagePoints에서 누락된 코너의 x-y 좌표로 [NaN,NaN]을 사용하여 부분적으로 검출된 체커보드를 반환합니다. 이 디폴트 동작은 'PartialDetections' 이름-값 인수를 사용하여 수정할 수 있습니다.

  • 가능한 경우, 함수는 원점 위치와 코너 배열이 완전히 보이는 체커보드와 일치하도록 부분적으로 검출된 체커보드의 방향을 설정합니다. 함수가 입력 영상에서 완전한 체커보드를 검출할 수 없는 경우, 검출된 가장 큰 체커보드가 기준 체커보드로 사용되며 이 체커보드의 크기가 boardSize로 반환됩니다.

체커보드 크기로, 요소를 2개 가진 [height, width] 벡터로 반환됩니다. 체커보드의 크기는 정사각형의 개수로 표현됩니다.

체커보드를 검출할 수 없는 경우, 함수는 boardSize[0,0]으로 설정합니다.

패턴 검출 플래그로, N개의 논리값으로 구성된 N×1 논리형 벡터로 반환됩니다. 이 함수는 입력 영상 수와 동일한 개수의 논리값을 출력합니다. true 값은 대응 영상에서 패턴이 검출되었음을 나타냅니다. false 값은 함수가 패턴을 검출하지 못했음을 나타냅니다.

스테레오 쌍 패턴 검출 플래그로, N개의 논리값으로 구성된 N×1 논리형 벡터로 반환됩니다. 이 함수는 입력 영상 수와 동일한 개수의 논리값을 출력합니다. true 값은 대응 스트레오 영상 쌍에서 패턴이 검출되었음을 나타냅니다. false 값은 함수가 패턴을 검출하지 못함을 나타냅니다.

스테레오 쌍 패턴 검출의 경우, 체커보드가 두 영상 모두에서 완전히 보여야 검출됩니다. 단일 카메라 보정과 달리, 부분적으로 검출된 체커보드는 스테레오 영상 쌍에서 기각됩니다.

참고 문헌

[1] Geiger, A., F. Moosmann, O. Car, and B. Schuster. "Automatic Camera and Range Sensor Calibration using a Single Shot," International Conference on Robotics and Automation (ICRA), St. Paul, USA, May 2012.

확장 기능

모두 확장

버전 내역

R2014a에 개발됨