카메라 캘리브레이션 (Camera Calibration)

영상처리 2013. 2. 1. 16:59

카메라 캘리브레이션 (camera calibration)은 영상처리, 컴퓨터 비전 분야에서 번거롭지만 꼭 필요한 과정중의 하나입니다. 본 포스팅에서는 카메라 캘리브레이션의 개념, 카메라 내부 파라미터, 외부 파라미터, 카메라 핀홀 모델, 카메라 캘리브레이션 도구에 대해 관련된 개념이나 이론적 배경들을 전반적으로 정리해 보았습니다.


그림1. 카메라 캘리브레이션


0. 카메라 캘리브레이션이란?

1. 캘리브레이션 개요

2. 카메라 내부 파라미터(intrinsic parameters)

3. 카메라 외부 파라미터(extrinsic parameters)

4. 핀홀(pinhole) 카메라 모델

5. 캘리브레이션과 영상해상도 그리고 자동초점조절(auto focusing)

6. 캘리브레이션 도구(tool) 및 사용법

7. 캘리브레이션 결과가 달라지는 이유

8. 카메라 캘리브레이션 팁



0. 카메라 캘리브레이션이란?


우리가 실제 눈으로 보는 세상은 3차원입니다. 하지만 이것을 카메라로 찍으면 2차원의 이미지로 변하게 됩니다. 이 때, 3차원의 점들이 이미지 상에서 어디에 맺히는지는 기하학적으로 생각하면 영상을 찍을 당시의 카메라의 위치 및 방향에 의해 결정됩니다. 하지만 실제 이미지는 사용된 렌즈, 렌즈와 이미지 센서와의 거리, 렌즈와 이미지 센서가 이루는 각 등 카메라 내부의 기구적인 부분에 의해서 크게 영향을 받습니다. 따라서, 3차원 점들이 영상에 투영된 위치를 구하거나 역으로 영상좌표로부터 3차원 공간좌표를 복원할 때에는 이러한 내부 요인을 제거해야만 정확한 계산이 가능해집니다. 그리고 이러한 내부 요인의 파라미터 값을 구하는 과정을 카메라 캘리브레이션이라 부릅니다.



1. 캘리브레이션 개요


카메라 영상은 3차원 공간상의 점들을 2차원 이미지 평면에 투사(perspective projection)함으로써 얻어집니다. 핀홀(pinhole) 카메라 모델에서 이러한 변환 관계는 다음과 같이 모델링됩니다.


(1)


여기서, (X,Y,Z)는 월드 좌표계(world coordinate system) 상의 3D 점의 좌표, [R|t]는 월드 좌표계를 카메라 좌표계로 변환시키기 위한 회전/이동변환 행렬이며 A는 intrinsic camera matrix입니다.


그림 2. 카메라 좌표계


수식적으로 보면 카메라 캘리브레이션(camera calibration)은 위와 같은 3D 공간좌표와 2D 영상좌표 사이의 변환관계 또는 이 변환관계를 설명하는 파라미터를 찾는 과정입니다.


식(1)에서 [R|t]를 카메라 외부 파라미터(extrinsic parameter), A를 내부 파라미터(intrinsic parameter)라고 부릅니다. 그리고 A와 [R|t]를 합쳐서 camera matrix 또는 projection matrix라 부릅니다.


카메라 외부 파라미터는 카메라의 설치 높이, 방향(팬, 틸트) 등 카메라와 외부 공간과의 기하학적 관계에 관련된 파라미터이며 내부 파라미터는 카메라의 초점 거리, aspect ratio, 중심점 등 카메라 자체의 내부적인 파라미터를 의미합니다.



2. 카메라 내부 파라미터(intrinsic parameters)


카메라의 내부 파라미터로는 다음과 같은 것들이 있습니다.

  1. 초점거리(focal length): fx, fy
  2. 주점(principal point): cx, cy
  3. 비대칭계수(skew coefficient): skew_c = tanα



A. 초점거리(focal length)


흔히 초점거리라 하면 볼록렌즈의 초점을 생각하기 쉬운데, 여기서(카메라 모델) 말하는 초점거리는 렌즈중심과 이미지센서(CCD, CMOS 등)와의 거리를 말합니다.


그림 3. 카메라 모델


디지털 카메라 등에서 초점거리는 mm 단위로 표현되지만 카메라 모델에서 말하는 초점거리(f)는 픽셀(pixel) 단위로 표현됩니다. 즉, f의 단위로 픽셀이라는 의미입니다.


이미지의 픽셀(pixel)은 이미지 센서의 셀(cell)에 대응되기 때문에, 초점거리(f)가 픽셀(pixel) 단위라는 의미는 초점거리가 이미지 센서의 셀(cell) 크기에 대한 상대적인 값으로 표현된다는 의미입니다. 예를 들어, 이미지 센서의 셀(cell)의 크기가 0.1 mm이고 카메라의 초점거리가 f = 500 pixel이라고 하면 이 카메라의 렌즈 중심에서 이미지 센서까지의 거리는 이미지 센서 셀(cell) 크기의 500배 즉, 50 mm라는 의미입니다.


컴퓨터 비전 분야에서 카메라 초점거리를 물리단위(m, cm, mm, ...)가 아닌 픽셀단위로 표현하는 이유는 (이미지 픽셀과 동일한 단위로 초점거리를 표현함으로써) 영상에서의 기하학적 해석을 용이하게 하기 위함입니다.


그런데, 카메라 모델에서 초점거리를 하나의 값으로 f라 표현하지 않고 fx, fy로 구분하여 표현하는 경우가 있는데(실제로 카메라 캘리브레이션을 수행하면 fx, fy를 구분하여 반환한다) 이는 이미지 센서의 물리적인 셀 간격이 가로 방향과 세로 방향이 서로 다를 수 있음을 모델링하기 위함입니다. 이 경우 fx는 초점거리(렌즈중심에서 이미지 센서까지의 거리)가 가로 방향 셀 크기(간격)의 몇 배인지를 나타내고 fy는 초점거리가 세로 방향 센서 셀 크기(간격)의 몇 배인지를 나타냅니다. fx와 fy 모두 단위는 픽셀(pixel)이며 현대의 일반적인 카메라는 가로방향 셀 간격과 세로방향 셀 간격의 차이가 없기 때문에 f = fx = fy라 놓아도 무방합니다.


참고로, 동일한 카메라로 캘리브레이션을 수행했을 때, 이미지 해상도를 1/2로 낮추면 캘리브레이션 결과의 초점거리도 1/2로 작아집니다. 실제 물리적 초점거리가 변하는 것은 아니지만 카메라 모델에서의 초점거리는 상대적인 개념이기 때문에 해상도를 바꾸면 한 픽셀(pixel)에 대응하는 물리크기가 변하고 따라서 초점거리도 변하게 됩니다. 예컨데, 이미지 해상도를 1/2로 낮추면 이미지 센서의 2 x 2 셀(cell)들이 합쳐서 하나의 이미지 픽셀이 되기 때문에 한 픽셀에 대응하는 물리크기가 2배가 됩니다. 따라서 초점거리는 1/2이 되어야 합니다.


카메라 모델의 렌즈중심(초점)은 핀홀 카메라 모델(그림 6)에서 핀홀(pinhole)에 해당됩니다. 핀홀 카메라 모델은 모든 빛은 한 점(초점)을 직선으로 통과하여 이미지 평면(센서)에 투영된다는 모델입니다. 이러한 핀홀 모델은 3D 공간과 2D 이미지 평면 사이의 기하학적 투영(projection) 관계를 매우 단순화시켜 줍니다.


초점으로부터 거리가 1(unit distance)인 평면을 normalized image plane이라고 부르며 이 평면상의 좌표를 보통 normalized image coordinate라고 부릅니다. 물론 이것은 실제는 존재하지 않는 가상의(상상의) 이미지 평면입니다. 카메라 좌표계 상의 한 점 (Xc, Yc, Zc)를 영상좌표계로 변환할 때 먼저 Xc, Yc를 Zc(카메라 초점에서의 거리)로 나누는 것은 이 normalized image plane 상의 좌표로 변환하는 것이며, 여기에 다시 초점거리 f를 곱하면 우리가 원하는 이미지 평면에서의 영상좌표(pixel)가 나옵니다 (그림 4 참조). 그런데, 이미지에서 픽셀좌표는 이미지의 중심이 아닌 이미지의 좌상단 모서리를 기준(원점)으로 하기 때문에 실제 최종적인 영상좌표는 여기에 (cx, cy)를 더한 값이 됩니다. 즉, x = fxX/Z+cx, y = fyY/Z+cy. 카메라 모델에서 사용하는 좌표계 표현 및 변환에 대한 보다 자세한 내용에 대해서는 [영상처리] - [영상 Geometry #1] 좌표계 글을 참조하기 바랍니다.



그림 4. 카메라 투영(projection) 모델


☞ 초점거리에 대한 보다 자세한 내용에 대해서는 [영상처리] - 카메라의 초점거리(focal length) 글을 참조하기 바랍니다 (2013.10.23).

☞ 이미지평면(이미지센서)은 실제로는 렌즈 뒤쪽에 있지만, 기하학적 연산을 단순화하기 위해 위 그림처럼 렌즈 앞쪽에 위치시키는 것이 일반적입니다. (reflected model)



B. 주점(principal point)


주점 cx, cy는 카메라 렌즈의 중심 즉, 핀홀에서 이미지 센서에 내린 수선의 발의 영상좌표(단위는 픽셀)로서 일반적으로 말하는 영상 중심점(image center)과는 다른 의미입니다. 예를 들어서, 카메라 조립과정에서 오차로 인해 렌즈와 이미지 센서가 수평이 어긋나면 주점과 영상중심은 다른 값을 가질 것입니다.


영상기하학에서는 단순한 이미지 센터보다는 principal point가 훨씬 중요하며  영상의 모든 기하학적 해석은 이 주점을 이용하여 이루어집니다.



C. 비대칭 계수(skew coefficient)


비대칭 계수 skew_c는 이미지 센서의 cell array의 y축이 기울어진 정도를 나타냅니다 (skew_c = tanα).

그림 5. 카메라 비대칭 계수


요즘 카메라들은 이러한 skew 에러가 거의 없기 때문에 카메라 모델에서 보통 비대칭 계수까지는 고려하지 않는다고 합니다 (즉, skew_c = 0).


이러한 카메라 내부 파라미터들은 공개된 캘리브레이션 툴 등을 이용하면 비교적 쉽게 계산할 수 있습니다. 공개 캘리브레이션 툴 소개 및 사용법은 본 포스팅 하단을 참조하시기 바랍니다.



3. 카메라 외부 파라미터(extrinsic parameters)


카메라 외부 파라미터는 카메라 좌표계와 월드 좌표계 사이의 변환 관계를 설명하는 파라미터로서, 두 좌표계 사이의 회전(rotation) 및 평행이동(translation) 변환으로 표현됩니다.


카메라 외부 파라미터는 카메라 고유의 파라미터가 아니기 때문에 카메라를 어떤 위치에 어떤 방향으로 설치했는지에 따라 달라지고 또한 월드 좌표계를 어떻게 정의했느냐에 따라서 달라집니다.


카메라 외부 파라미터를 구하기 위해서는 먼저 캘리브레이션 툴 등을 이용하여 카메라 고유의 내부 파라미터들을 구합니다. 다음으로는 미리 알고 있는 또는 샘플로 뽑은 3D월드좌표–2D영상좌표 매칭 쌍들을 이용하여 식(1)에서 변환행렬을 구하면 됩니다. OpenCV에 있는 solvePnP함수를 이용하면 이러한 계산을 손쉽게 할 수 있습니다.


☞ 카메라 외부 파라미터 캘리브레이션 및 영상 기하학에 대한 전반적인 내용에 대해서는 [영상처리] - Extrinsic Camera Calibration - 카메라의 위치 및 자세 파악 글을 참고하기 바랍니다.



4. 핀홀(pinhole) 카메라 모델


핀홀 카메라 모델은 아래 그림과 같이 하나의 바늘구멍(pinhole)을 통해 외부의 상이 이미지로 투영된다는 모델입니다. 이 때, 이 바늘구멍(pinhole)이 렌즈 중심에 해당되며 이곳에서 뒷면의 상이 맺히는 곳까지의 거리가 카메라 초점거리입니다 (광학적으로 렌즈의 중심을 투과하는 빛은 굴절되지 않고 그대로 직선으로 투과한다고 합니다).


그림 6. 핀홀 카메라 모델

(그림출처: http://en.wikipedia.org/wiki/Pinhole_camera_model)


영상처리 분야에서 영상에 대한 모든 기하학적 해석은 이 핀홀 카메라 모델을 바탕으로 이루어집니다. 하지만, 사실 핀홀 카메라 모델은 매우 이상적인 카메라 모델이며 실제로는 렌즈계의 특성에 따른 영상 왜곡 등도 같이 고려되어야 합니다. 영상 왜곡에 대한 내용은 [영상처리] - 카메라 왜곡보정을 참조해 주시기 바랍니다.



5. 캘리브레이션과 영상 해상도 그리고 자동초점조절(auto focusing)


카메라에 있는 오토 포커싱(auto focusing) 기능을 켜면 계속 초점거리가 바뀔 수 있기 때문에 캘리브레이션 목적에는 적합하지 않습니다. 카메라에 대해 캘리브레이션을 수행하고 캘리브레이션 결과를 다른 계산 목적에 사용하고자 한다면 오토 포커싱 기능은 꺼 놓고 사용하는게 좋습니다.


카메라에는 보통 영상 해상도를 QVGA(320x240), VGA(640x480), 960x480, ... 등 다양하게 설정할 수 있습니다. 그런데, 영상 해상도를 바꾸면 카메라 캘리브레이션 결과도 바뀌는 것을 확인 할 수 있을 것입니다. 카메라 내부 파라미터중 초점거리 fx, fy, 주점 cx, cy는 픽셀 단위를 사용하는데, 카메라의 물리적인 초점거리나 이미지 센서의 크기는 변하지 않지만 한 픽셀이 나타내는 물리적 크기가 변하기 때문입니다. 그래서 만일 영상해상도를 VGA로 놓고 캘리브레이션 한 결과과 QVGA로 놓고 캘리브레이션 한 결과를 비교해 보면 QVGA의 경우가 fx, fy, cx ,cy의 값이 1/2씩 줄어들게 됩니다. 반면에 렌즈왜곡계수(k1, k2, p1, p2)는 normalized 좌표계에서 수행되기 때문에 영상 해상도와 관계없이 항상 동일합니다. 따라서, 한 해상도에서만 캘리브레이션을 수행해도 다른 모든 해상도에 대한 파라미터 값을 구할 수 있게 됩니다. 렌즈왜곡계수는 동일하며, fx,fy,cx,cy만 영상 해상도에 비례해서 조정해 주면 됩니다.



6. 캘리브레이션 도구(tool) 및 사용법


A. Dark Cam Calibrator


최근에 직접 구현한 것인데 필요하시면 한번 사용해 보시기 바랍니다 ([개발한 것들] - 카메라 캘리브레이션 프로그램 (DarkCamCalibrator)). 카메라에서 직접 영상을 획득할 수 있으며 Fisheye 왜곡모델에 대한 캘리브레이션도 가능하다는 특징이 있습니다. OpenCV를 이용하여 구현한 것으로서 캘리브레이션 성능 자체는 OpenCV 성능과 같습니다.



B. GML C++ Camera Calibration Toolbox


가장 손쉽게 이용할 수 있는 공개 캘리브레이션 툴로는 GML C++ Camera Calibration Toolbox가 있습니다. 현재 0.73버전이 가장 최신버전이며 소소코드도 같이 공개되어 있습니다.


사이트 링크: http://graphics.cs.msu.ru/en/node/909

직접 다운로드: GML_CameraCalibrationInstall_0.73.exe



그림 7. GML 카메라 캘리브레이션 툴


기본적인 사용법은 캘리브레이션 패턴(chess board)이 인쇄된 종이를 다양한 위치 및 각도에서 카메라로 촬영한 후 영상으로 저장하고 위 툴(tool)로 캘리브레이션을 수행하면 됩니다. 자세한 사용법 및 최적의 영상획득 방법 등은 프로그램 자체에 포함된 설명문(Help)을 참조하시기 바랍니다.


이 툴의 특징은 위 그림과 같이 여러 개의 캘리브레이션 패턴을 동시에 사용하여 캘리브레이션을 수행할 수 있다는 점입니다. 툴의 설명문에 보면 2개 이상의 패턴을 사용했을 때 캘리브레이션 효과가 좀더 좋다고 나와 있습니다. 물론 1개의 패턴만을 사용하는 것도 가능합니다.


위 툴을 사용하여 캘리브레이션을 수행하면 다음과 같은 형태로 결과를 볼 수 있습니다.


그림 8. GML 카메라 캘리브레이션 툴 실행 예시


캘리브레이션 결과는 위 예와 같이 추정치 ± 추정오차(3*sigma) 형태로 출력되며 각각의 항목의 의미는 다음과 같습니다.

  • Focal length: fx = 3497.576, fy = 3501.038
  • Principal point: cx = 1058.429, cy = 797.136
  • Distortion: k1 = -0.041196, k2 = -0.203893, p1 = 0.006114, p2 = 0.002318 (k1,k2: radial distortion 계수, p1,p2: tangential distortion 계수)



C. Camera Calibration Toolbox for Matlab


아마도 카메라 캘리브레이션 분야에 있어서 가장 대표적인 툴로 생각됩니다. Matlab으로 구현되어 있으며 다소 사용법이 복잡하지만 캘리브레이션 과정의 세세한 부분을 직접 설정할 수 있으며 보다 정밀한 캘리브레이션이 가능합니다.


사이트 링크: http://www.vision.caltech.edu/bouguetj/calib_doc/


그림 9. Caltech 카메라 캘리브레이션 툴


위 사이트는 또한 카메라 캘리브레이션 분야에 있어서 가장 대표적인 사이트로서 캘리브레이션 툴 뿐만 아니라 캘리브레이션에 대한 전반적인 이론 및 정보가 잘 정리되어 있습니다. 캘리브레이션을 연구하는 (영어권) 사람들은 주로 이 사이트를 통해 필요한 정보를 얻는 것으로 알고 있습니다.



7. 캘리브레이션 결과가 달라지는 이유 (2015.5.12 추가)


댓글로 문의를 많이 주시는 내용인데 본문에 내용을 추가하는 것도 좋을 것 같아서 추가합니다.


카메라 캘리브레이션 결과가 달라지는 것은 먼저 카메라의 auto focus 기능이 켜져 있는지 확인해야 합니다. 물론 auto focus 기능이 꺼져 있음에도 불구하고 결과가 달라질 수 있지만 그 편차는 auto focus 기능이 켜져 있는 경우에 비해 훨씬 줄어들 것입니다. 하지만, auto focusing 여부와 관계없이 근본적으로 동일한 카메라에 대해 캘리브레이션 결과가 달라질 수 있는 이유는 몇 가지 원인이 있는데 적어보면 다음과 같습니다.

  • 캘리브레이션은 완벽한 핀홀 카메라 모델을 가정하고 파라미터를 찾지만 실제 카메라는 핀홀 카메라 모델이 아닐 수 있습니다.
  • 카메라 캘리브레이션 과정에 렌즈계 왜곡모델이 들어가는데, 일반적으로 사용되는 렌즈계 왜곡모델은 왜곡 특성을 저차의 다항함수로 근사하는 것이기 때문에 실제의 렌즈계 왜곡과는 차이가 발생할 수 있습니다.
  • 마지막으로 카메라 캘리브레이션은 어떤 방정식을 풀어서 딱 떨어지게 해를 찾는 것이 아니라 해에 대한 초기 추정치부터 시작해서 최적화 기법을 적용하여 반복적인 탐색 과정을 거쳐 근사적인 해를 찾는 것이기 때문에 매번 해가 달라질 수 있습니다.

결국 카메라의 내부 파라미터 자체는 고유값이지만 캘리브레이션 모델 자체가 근사적인 모델이기 때문에 사용한 이미지에 따라 최적 근사해가 달라질 수 있습니다.



8. 카메라 캘리브레이션 팁 (2015.5.12 추가)


카메라 캘리브레이션 팁도 간단하게 같이 적어봅니다. 카메라와 패턴과의 거리에 대해 문의를 많이 주시는데 패턴과의 거리는 최대한 가까울수록 좋습니다. 그 이유는 캘리브레이션 자체는 패턴과의 거리와 관계없지만 패턴과의 거리가 가까우면 영상에서 좀더 정밀하게 코너점의 위치를 찾을 수 있기 때문입니다. (경험적으로) 패턴 영상의 개수는 4개 이상이면 어느정도 캘리브레이션이 가능하지만 많을수록 좋으며 20장 이상 정도면 무난하다고 생각됩니다. 마지막으로 패턴 영상을 획득할 때에는 되도록 다양한 각도에서 영상을 획득하면 좋습니다.



관련 포스팅


by 다크 프로그래머

  • 이전 댓글 더보기
  • SilentEVE 2020.09.25 15:01 ADDR 수정/삭제 답글

    안녕하세요 예전에 World->Camera RT 관련하여 답변주셔서 감사합니다.
    다름이 아니라 카메라 캘 부분에서 궁금한점이 생겨 댓글을 달게되었습니다.
    캘리브레이션의 주요 목적은 카메라의 내부 파라메터를 알기 위해서라고 이해하고있습니다.
    여기서 일반적인 카메라가 아닌 360도 VR 카메라(Samsung Gear, RICOH. etc)같은 경우에는 바로 얻는 영상 데이터에서 이미 왜곡현상이 눈에 띄게 보이게 되는데 이런 특수한 카메라 같은 경우에도 일반적인 카메라의 캘리브레이션 과정과 동일하게 캘리브레이션을 수행하는지 알고싶습니다.

    • BlogIcon 다크pgmr 2020.09.25 21:34 신고 수정/삭제

      150도 카메라까지는 일반 캘리브레이션 방법으로 펴본 적은 있습니다. 특별히 문제없이 잘 되었구요. 그런데, 180도 카메라까지는 잘 모르겠네요. 리코세타 등은 360도 아니고 180도짜리 두개 붙인 것이라서 각각은 180도 짜리입니다.

    • BlogIcon SilentEVE 2020.09.27 16:22 수정/삭제

      180도 카메라가 생각보다 왜곡이 엄청 심해보이고 항상 다루던 일반적인 카메라와는 다른 특수한 방식이라 별도의 캘리브레이션 방법이 있을거라고 생각했습니다. 감사합니다

    • BlogIcon 다크pgmr 2020.10.04 20:10 신고 수정/삭제

      네, 제 생각에도 fisheye용 방법이 따로 있을 것도 같습니다. 캘리브레이션 방법도 워낙 많으니까요.
      제가 아는 것은 F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14?24, 2001 논문의 방법인데, 어지간한 광각도 잘 펴지는 것 같습니다. 그리고 opencv의 Zhang 방법도 사실 왠만큼은 잘 되는 편이구요. https://darkpgmr.tistory.com/139 글에 두 방법을 구현한 tool을 올렸는데, 혹시 이걸로 해결이 될지 모르겠습니다.

  • 다크교 2020.10.29 17:40 ADDR 수정/삭제 답글

    안녕하세요 자주 보면서 도움을 많이 받고 있습니다.
    저가의 카메라인 fisheye를 사용하여 calibration을 하던 도중 궁금함이 생겼습니다. 찾아봐도 아리송 해서요
    기존 fisheye모델도 왜곡이 심하지만 않다면 cv2 cameracalibration을 해도 잘되는데,
    왜곡이 심한경우 예를들면,
    https://docs.opencv.org/3.4/db/d58/group__calib3d__fisheye.html#ga167df4b00a6fd55287ba829fbf9913b9
    의 undistortImage()부분의 설명과 같은 영상때문에 calib3d.hpp의 cv::fisheye::cameracalibration을 쓰는 건가요? 더 적은 distortion parameter로 왜곡보정을 더 좋게 할 수 있기 떄문에? 이 부분이 궁금합니다.ㅠㅜ

    fisheye렌즈를쓰면 꼭 cv::fisheye::cameracalibration을 써야 하는줄 알았는데 아닌것 같아서요...

    • BlogIcon 다크pgmr 2020.10.30 06:40 신고 수정/삭제

      안녕하세요. 저는 아직 cv::fisheye는 사용해 보지 않아서 잘 모르겠습니다. 하지만 cv::calibrateCamera가 fisheye 렌즈에 적합하지 않은 것은 사실입니다. 렌즈의 왜곡 변환을 단지 (5차) 다항함수로 근사하는 것이기 때문에 테두리 쪽에는 왜곡이 잘 안펴질 수 있습니다. 물론 왜곡이 심하지 않은 경우에는 충분히 활용할 수 있고, 영상을 획득할 때, 체스판이 영상 테두리에서 검출되도록 잘 위치시키고 영상을 획득하면 쓸만한 결과를 얻을수는 있습니다.
      저는 개인적으로는 F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14?24, 2001 논문의 방법을 사용하고 있으며, https://darkpgmr.tistory.com/139 글에 있는 툴을 사용하면 캘리브레이션이 가능합니다.

    • BlogIcon 다크교 2020.10.30 14:39 수정/삭제

      감사합니다 다크프로그래머님 항상 어려운 내용을 조금 더 쉽게 나눠 주셔서 감사드립니다. 최고입니다. 다크님 만수무강하세요!

  • 필립스 2020.11.24 00:02 ADDR 수정/삭제 답글

    안녕하세요? 다크프로그래머님
    간만에 다시 질문드리내요.
    다크님의 글 너무 잘 보고 있습니다. 다양한 시도로 해결을 해보려고 했는데 잘 안되내요.
    휴대폰 카메라로 사람의 사진을 찍고, 왜곡을 보정해서 치수 추출이 가능할까요?
    1. 보정을 하면 왜곡을 완전히 사라지게 할 수 있을까요?
    > 키 어깨너비등 오차율 1~1.5%내외로 측정이 가능할까요?
    2. 휴대폰 이미지는 왜곡 보정이 된 것이라 보정이 어려울지?
    3. 켈리브레이션 같은 이미지 출력물 없이는 보정이 어려울까요?

    가장 중요한건 다크님의 경험이 좀 중요합니다.
    오차율 1~1.5%내외로 멀리 있는 물체나 사람의 치수를 정확하게 추출이 가능할지..알고 싶습니다. 답변 주시면 정말 감사하겠습니다..방향성을 못잡고 있내요.^^


    • BlogIcon 다크pgmr 2020.11.24 17:36 신고 수정/삭제

      안녕하세요. 조건에 따라 다르겠지만 원래 영상으로 치수 측정은 안됩니다. 같은 물체라도 가까운 물체는 크게 보이고 멀리 있는 물체는 작게 보이는데, 영상만 가지고 치수를 측정할 수는 없습니다. 다만, 크기를 미리 알고 있는 물체의 경우에는 영상을 보고 거리를 측정할 수는 있습니다. 하지만 그 경우에도 카메라와 물체와의 각도에 따라서 그 값이 달라지기 때문에 각도 정보도 알고 있어야 합니다. 그리고 물체와의 거리가 멀어질수록 영상에서 차지하는 픽셀(pixel)수가 적어지기 때문에 정확도는 기하급수적으로 떨어지게 됩니다. 따라서, 정확도라는 것을 일반적으로 정의할 수는 없습니다.
      그리고.. 왜곡 보정은 어느 정도는 됩니다만 100% 되는 기술은 없습니다.

    • BlogIcon 필립스 2020.11.24 18:52 수정/삭제

      빠른 답변 감사합니다.^^
      연구 방향을 다르게 설정해야겠내요.

  • 스테레오미궁에갇힘 2020.12.15 16:03 ADDR 수정/삭제 답글

    안녕하세요 다크님
    다크님 블로그를 몇년째 들어와서 보는것 같습니다. 항상 감사드립니다.
    질문은 처음 드리는것 같은데요 혹시 시간이 괜찮으시면 알려주시면 정말 감사드리겠습니다.

    1. Opencv 내의 stereoCalibrate 함수에서 아래 변수들은 inputOutputArray 라고 되어 있는데, 초기에는 어떤 값을 넣어도 문제가 없을까요?
    inputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2,

    2. 제가 CALIB_FIX_ASPECT_RATIO flag 를 넣고 안넣고에 따라 rms 값이 너무 크게 변해서 당황하는 중입니다. 이 플래그에 따라 1번 질문의 초기값이 있고 없고에도 영향을 너무 많이 받구요...

    관련하여 조금이라도 도움을 주실수 있다면 정말 감사드리겠습니다.

    • BlogIcon 다크pgmr 2020.12.16 16:46 신고 수정/삭제

      저도 스테레오 캘리브레이션은 해 보지 않아서 잘은 모르겠지만, flag 중에 use_initial_guess 그런 비슷한 값을 사용하지 않는다면 초기값은 관련이 없을 듯 싶습니다 (확실치는 않아요). 보통은 cameraMatrix는 identity 행렬, distCoeffs는 영벡터로 주면 될 것 같습니다.
      그리고, calib_fix_aspect_ratio flag를 설정한 경우에는 cameraMatrix.at<double>(0, 0) = 1;와 같이 카메라 행렬의 첫 번째 원소값을 1로 설정했던 것 같습니다. stereo 것은 아니지만 opencv의 sample code 중에서 calibration.cpp 파일을 참조해 보시면 도움이 될 것 같습니다.

  • 스케일 2020.12.18 14:34 ADDR 수정/삭제 답글

    안녕하세요 다크님.
    영상쪽 블로그 올려주신 내용 정말 잘 읽고 공부하고 있습니다.
    다름이 아니라, 영상에서 mm 를 pixel로 바꿔주는 scale factor 값이 자주 등장하는데
    해당 값은 어떻게 계산을 해야하는지 궁금해 댓글 달게 되었습니다.

    저는 블랙박스 이미지로 openCV를 이용해 fx,fy,cx,cy를 구했는데. scale factor (mm/pixel)은 어떻게 해야할지 모르겠네요.. 혹시 도움을 주실 수 있다면 댓글 달아주시면 감사드리겠습니다.

    • BlogIcon 다크pgmr 2020.12.23 09:06 신고 수정/삭제

      안녕하세요. 스케일 팩터는 물체와의 거리에 따라서 달라지는 것이라서 값이 정해지지 않습니다. 하지만, 물체가 지면위에 있는 경우에는 https://darkpgmr.tistory.com/153 글에 있는 방법을 사용할 수 있습니다.

  • 드롸군 2021.01.08 17:32 ADDR 수정/삭제 답글

    안녕하세요 다른분들과 마찬가지로 항상 잘 보고 있는 학생입니다.

    하나 궁금한 것이 있습니다. 본문 마지막에, "되도록이면 캘리브레이션판과 가까울수록 좋다" 라고 이야기를 해 주셨습니다.

    "가까운 영상을 담을 때와 먼 영상을 담을 때, 카메라의 focal length 가 변한다." 와 "캘리브레이션은 패턴과의 거리와 상관없다." 라는 내용이 충돌하는 것 아닌가? 궁금합니다.

    제가 만약 10m 거리에 있는 사람을 주로 촬영을 할 것이라면, 10m 거리에 서서 초점을 맞추어 두고 캘리브레이션을 진행하는 것이 맞는 방향이 아닌가? 라는 생각이 들었습니다.

    • BlogIcon kevin 2021.07.09 11:01 수정/삭제

      이 분 말씀에 동의합니다. "카메라와 패턴과의 거리는 가까울수록 좋은 것"이 아니라, 현재 설정한 초점 거리에 맞춰야 한다고 생각합니다. 그 초점 거리는 캘리브레이션 이 후의 application이 카메라로 부터 얼마나 떨어진 거리에서 일어나느냐로 정해지는 것일 거구요. 다시 말해서 내가 캘리 정보를 가지고 카메라로 부터 2미터 떨어진 공간에서 인식/포즈 추정 등의 작업을 하고 싶으면 2미터 거리에 체스보드를 놓고 체스보드가 가장 선명하게 보이게 포커스를 조절하고 그렇게 찍은 체스보드 이미지들을 가지고 캘리를 해서 그 포커스를 보정하는 것입니다. 그 이후에 내 application이 50센치에서 떨어진 공간에서 인식/포즈 하는 것이라면 다시 50센치 떨어진 위치에 보드를 놓고 보드가 가장 선명하게 보이게 포거스를 조정하고, 여러 장 찍어서 그 거리에 맞게 캘리하는 것입니다. 그러니까 포커스를 조절할 수 있는 캠에서는 application에서 원하는 거리에 맞게 계속 캘리하는 사이클을 돈다고 생각합니다.

  • BlogIcon 다크pgmr 2021.01.13 12:41 신고 ADDR 수정/삭제 답글

    그렇게 볼 수도 있겠네요. 보통 캘리브레이션을 하기 전에 카메라의 auto focusing 기능을 꺼 두고 합니다. 카메라 초점거리가 고정된 상태에서 근거리 촬영이 좋다는 의미로 해석 바랍니다.

  • 제드 2021.01.13 12:45 ADDR 수정/삭제 답글

    안녕하세요.
    카메라 캘리브레이션 관련해 자료를 찾다가 글을 접하게 된 학생입니다.

    저의 경우에는 현재 zed 카메라를 사용하고 있는데, 이 카메라에서 내부파라미터 값들을 주고 있습니다. 그런데 카메라가 auto focusing이 되어있어서 출력 값이 매번 다릅니다.
    그래서 출력 값을 코드 상에서 받아와서 fx, fy, cx, cy값들이 바뀔때 마다 그 값을 적용하여 캘리브레이션을 하고 있는데, 이렇게 해도 괜찮은건지 여쭤봅니다.

    • BlogIcon 다크pgmr 2021.01.13 13:25 신고 수정/삭제

      저는 제드 카메라를 써 보지는 않았지만, 카메라가 파라미터를 제공하고 그 값만 정확하다면 써도 괜찮치 않을까요?

  • SilentEVE 2021.02.10 10:34 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님, 궁금한점이 생겨 다시 댓글을 달게 되었습니다.
    카메라 캘리브레이션 부분에서 카메라 내부 파라미터와 왜곡계수, reprojection error를 구했습니다.
    여기서 reprojection error 가 0.0628 과 같이 나오는 것을 확인하고 이미지 undistortion을 수행하였는데
    원본 이미지보다 undistortion된 이미지가 더 왜곡되어 보인다면 왜곡계수 부분이 잘못 검출된 것으로 생각할 수 있나요??

    • BlogIcon 다크pgmr 2021.02.10 12:09 신고 수정/삭제

      네, 그렇겠죠? 그런데 reprojection error가 0.0628이면 캘리브레이션이 잘 된 것 같은데 이상하긴 합니다.

    • BlogIcon SilentEVE 2021.02.10 15:05 수정/삭제

      calibrateCamera() 함수가 반환하는 double값이 reprojection error 값이 아닌가요? 제가 말씀드린 0.0628값은 해당 함수에서 반환한 값입니다.

      이 값을 보고 캘리브레이션이 잘 된거같다고 생각은 되는데, 추출된 왜곡계수 값을 이용하여 왜곡보정된 이미지보다 원본 이미지(1920x1080)가 더 정상적인 이미지로 보여서 그렇습니다

    • BlogIcon 다크pgmr 2021.02.10 17:02 신고 수정/삭제

      혹시 캘리브레이션 패턴 이미지들을 한 방향(수직방향)으로만 찍은 것은 아닌가 의심됩니다. 수직으로만 패턴 영상을 찍으면 (이론적으로) 초점거리 추정이 불가능하기 때문에, rms가 작더라도 캘리브레이션 실제로는 잘못되었을 수 있습니다. 패턴 영상은 다양한 각도에서 찍는 것이 좋습니다.

    • BlogIcon SilentEVE 2021.02.15 08:08 수정/삭제

      감사합니다. 확인해보니 광축에 수직방향으로만 촬영하여 캘리브레이션 데이터로 사용한 것 같습니다.

      큰 체스보드 데이터가 없고, 먼 거리에서 데이터를 얻다보니, 의식적으로 체스보드 코너점이 잘 보이도록 한 방향으로 촬영한 데이터를 사용한 것 같습니다.

  • Gwak 2021.02.11 17:27 ADDR 수정/삭제 답글

    체커보드 패턴의 개수가 증가할 수록 왜 정확도가 높아지는 걸까요?
    다양한 각도에서 촬영한 체커보드가 더 정밀한 왜곡값을 구하는 데 도움이 되는건가요?
    카메라 매치무브 작업 중인데, 궁금해서 여쭤봅니다.
    감사합니다.

    • BlogIcon brepp 2021.02.16 20:30 수정/삭제

      저는 애초에 한 이미지에서 체커보드 패턴을 여러 개 쓸 수 있는 원리 자체가 궁금하네요.

      패턴이 하나라면, 그 패턴의 한 꼭짓점을 원점으로 두고 각 교차점들의 월드 좌표를 구할 수 있어서 calibration을 진행할 수 있는 것이라고 이해했는데...
      만약 패턴이 여러개라면 그 중 하나의 패턴의 꼭짓점을 원점으로 두었을 때, 나머지 패턴들의 교차점들의 월드 좌표계를 알 수 없는 것 아닌가요?

    • BlogIcon 다크pgmr 2021.02.24 10:22 신고 수정/삭제

      @Gwak
      캘리브레이션도 결국 최적화 문제로서 입력 패턴을 가장 잘 설명하는 카메라 파라미터를 근사적으로 찾는 과정입니다. 샘플링된 데이터가 한쪽 방향으로만 편향되었다면 찾아진 파라미터도 편향될 수 있습니다.
      예를 들어, 포물선을 근사할 때 포물선의 한쪽 면(중심축 기준 왼쪽 or 오른쪽)에서만 점들이 샘플링되었다면 이 점들로부터 구한 포물선이 원래의 포물선을 잘 모델링하기 어렵다는 것은 쉽계 예상할 수 있습니다.
      샘플이 적을수록, 그리고 샘플링이 편향될수록(전체를 골고루 샘플링하지 않고 특정 부분만 샘플링) 최적화 자체는 쉽고 근사 오차도 작게 나오겠지만 실제 정답이 아닐 가능성이 높습니다. 반면에, 샘플링이 골고루 될수록 문제가 풀기 어려워지기 때문에 근사 오차는 높아질 수 있지만 이렇게 구한 모델이 좀더 좋은 모델이라는 것은 예상할 수 있습니다.

    • BlogIcon 다크pgmr 2021.02.24 10:27 신고 수정/삭제

      @brepp
      실제 캘리브레이션을 할 때에는 패턴 이미지마다 전역좌표계를 서로 다르게 설정합니다 (각 이미지의 체커보드판을 기준으로 월드좌표계를 설정). 하지만 카메라의 내부 파라미터(초점거리, 왜고계수 등)는 전역좌표계 설정과는 무관하게 때문에 각각의 패턴 이미지들을 constraint로 해서 카메라 파라미터가 구해지게 됩니다.

    • BlogIcon 다크pgmr 2021.02.24 12:19 신고 수정/삭제

      (기타 참고사항)
      카메라 파라미터 중 왜곡계수를 잘 구하기 위해서는 이미지의 센터 및 외곽 등 다양한 위치에서 패턴을 취득하는 것이 중요하고, 초점거리를 잘 구하기 위해서는 다양한 각도에서 패턴을 취득하는 것이 중요합니다.

  • SkyOcean 2021.02.24 09:28 ADDR 수정/삭제 답글

    영상 처리를 새로 공부하고 있는데, 정리를 너무 잘해주셔서 큰 도움이 되네요.
    감사합니다.

  • SilentEVE 2021.03.03 16:28 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님 항상 질문에 답변을 달아주셔서 많은 도움이 되고있습니다, 감사합니다.
    영상처리 관련 공부하면서 생긴 두개의 궁금한 사항이 생겨 다시금 댓글을 달게 되었습니다.

    각 카메라의 센서 사이즈와 focal length를 이용하여 intrinsic matrix를 계산할 수 있다는 글을 보았습니다.
    그 방법을 이용하여 센서 사이즈가 17.3x13 mm이고 focal length가 15mm 렌즈인 경우, fovx = 59.94123, fovy = 46.857385 로 계산되었고, fx, fy가 1664 값으로 나왔습니다.
    해당 센서 정보(f=15, 17.3x13mm)를 Unity의 Physical Camera에 입력할 경우 계산된 fov값과 동일한것을 확인하였고, 가상환경에서 체스보드 사진을 찍어 opencv calibration 수행 결과 fx,fy가 1665 값으로 직접 계산한 값과 비슷하게 나왔습니다.

    하지만 저 센서 사이즈를 가진 카메라와 렌즈를 이용하여(3대의 카메라) 실제 체스보드 사진을 찍어 calibration을 수행한 결과 fx값이 1531, 1515, 1565와 같은 값으로 계산되었습니다.

    여기서 궁금한 점은 카메라가 센서 전체를 사용하지 않아 계산된 intrinsic fx fy 값과 같이 유사하게 나오지 않는 경우가 있나요?

    두번째로는 fx, fy, cx, cy값과 왜곡계수 값을 조정하면서 재투영 오차가 0에 가까운 intrinsic matrix 값을 계산하는 방법이 있을까요?

    • BlogIcon 다크pgmr 2021.03.08 11:01 신고 수정/삭제

      안녕하세요. 첫 번째 질문은 그럴 수도 있을 것 같습니다만, 저도 잘 알지는 못합니다.
      두 번째 질문은, 실제 카메라 캘리브레이션 알고리즘들이 내부적으로 하는 일들입니다. 즉, 카메라 캘리브레이션 알고리즘들은 최적화 기법 등을 사용하여 재투영 오차를 0으로 만들도록 파라미터를 계속 조정하고 그 결과를 반환합니다. 하지만 카메라 모델 자체가 인간이 만든 것으로서 실제 렌즈를 100% 정확하게 모델링하는 것은 아니기 때문에 재투영 오차가 0이 될 수는 없으며, 또한 코너점 추출에도 오차가 있을 수 있기 때문에 오차가 0이 되기는 어렵습니다.

    • BlogIcon SilentEVE 2021.03.10 09:44 수정/삭제

      답변 감사합니다. 실제로 intrinsic matrix 값을 조정하면서 재투영 오차를 계산해보고 있지만 opencv에서의 cameracalibrate 함수가 반환하는 재투영 오차 값 보다 못한 결과가 많이 나오고 있습니다.

  • 해피바드 2021.03.25 03:10 ADDR 수정/삭제 답글

    안녕하세요. 영상쪽 공부할때마다 필요할때마다 도움 잘 받고 있습니다. ^^
    현재 이미지를 이용해서 물체의 거리를 계산하는 방법을 공부하고 있습니다. openCV & Python을 이용하여 진행중인데 원근의 문제가 생기더군요... 카메라 캘리브레이션을 이용하면 원근에 의한 오차도 해결이 될까요??

    • BlogIcon 다크pgmr 2021.03.25 09:04 신고 수정/삭제

      원근의 문제라는 것이 구체적으로 어떤 것인지는 잘 모르겠네요.. 하지만 영상을 이용해서 물체의 거리를 계산하는 주제에 대해서는 https://darkpgmr.tistory.com/153 글을 참고하면 도움이 될지 모르겠습니다.

  • 비져 2021.03.29 17:30 ADDR 수정/삭제 답글

    안녕하세요
    공부하는데 너무 많은 도움이 됩니다^^
    테스트중 궁금한 사항이있어 문의드립니다!
    1. 내부파라미터 연산은 매번 이미지 취득시마다 값이 달라지는데
    그값의(fx,fy,cx,cy) 정합성을 확인 할수 있는 방법이 있나요?
    2. 그렇다면 외부파라미터 추출 후 나오는 중심값은 어떻게 어플리케이션에 활용될수 있는건지 궁금합니다. 캘리브레이션 진행시 원점을 사용자가 지정할수 있는것같은데 어떻게 사용해야 하는지 ㅠㅠ

    • BlogIcon 다크pgmr 2021.03.30 20:02 신고 수정/삭제

      안녕하세요. 1번 질문은, 딱히 방법이 있다기 보다는 캘리브레이션 결과로 반환되는 rms 값이 작은 경우를 사용하면 좋을 것 같습니다. 2번은 구체적인 방법을 설명드리긴 어렵지만, 캘리브레이션이 SolvePnP에서는 3차원 점의 월드좌표-영상좌표 대응관계를 이용해서 파라미터를 구하는데, 여기서 월드좌표를 자신이 원하는 월드좌표계에 맞추어 설정하면 됩니다.

  • zyxc 2021.05.30 21:32 ADDR 수정/삭제 답글

    calibration 작업을 꼭 체스판이 있는 사진으로만 해야 가능한건가요?
    어떠한 임의의 두사진으로는 할 수 없는것인가요?
    임의의 물체까지의 거리를 구하려고 하는데
    인터넷 자료를 아무리 찾아봐도 체스판을 이용해 calibration하는것만 있어서 질문드립니다. ㅠㅠ

  • ㅇㅇ 2021.06.02 17:17 ADDR 수정/삭제 답글

    안녕하세요 좋은 글 감사드립니다. 맨 위에서 두 번째 사진(카메라 모델 수식)에서 좌변 벡터 앞에 곱해진 스칼라 s는 Extrinsic Matrix로 투영을 거친 뒤 나온 카메라 좌표계에서의 Z 값(Zc)이라고 봐도 되겠죠? 그렇게 생각하면 밑에 설명하신 내용이랑 모든 게 맞아 떨어지는 것 같아서요. Extrinsic Matrix로 카메라 좌표계로 투영을 거친 뒤 => Z값으로 나눠 정규좌표계로 만들어 버린다. => Intrinsic Matrix를 곱해 영상 좌표계로 보낸다.

  • masici12 2021.06.04 14:45 ADDR 수정/삭제 답글

    안녕하세요. 좋은 글을 쉽게 올려주신 덕분에 공부에 정말 많은 도움이 됩니다. 감사합니다.
    한 가지 궁금한 점이 있는데, 다크프로그래머님 캘리브레이션 툴을 사용해서 캘리브레이션을 하고 있는데 기존의 사진을 파이썬이나 매트랩같은 tool로 픽셀을 조정하여(resize()함수 이용) 사진의 크기를 줄이고 캘리브레이션을 했을 때 RMS가 줄어드는 것을 확인했습니다.( 물론 초점거리나 주점이 줄어든 크기에 비례해서 줄어듭니다.) 왜 RMS가 줄어드는지 알 수 있을까요??

    • BlogIcon 다크pgmr 2021.06.04 15:52 신고 수정/삭제

      rms는 캘리브레이션으로 찾아진 모델에서 추정한 픽셀 위치와 실제 검출된 코너점들 사이의 픽셀 에러를 의미합니다. 그런데 작아진 이미지 크기에 비례해서 동일하게 줄어든 캘리브레이션 모델이 얻어진다고 가정해 보면, 이미지 scale이 작아지면 비례해서 rms도 작아지는 것은 당연하지 않을까 싶습니다.

    • BlogIcon masici12 2021.06.04 15:57 수정/삭제

      좋은 답변 항상 감사합니다.^^

  • BlogIcon 쥐현자 2021.06.09 10:35 ADDR 수정/삭제 답글

    안녕하세요 비전맨들의 아버지 다크프로그래머님. 이 카메라 캘리브레이션 페이지는 대학에 다닐 때부터 직장인이 되어서도 계속 찾게 되네요. ㅋㅋㅋ 정말 대단한 정리라고 생각하고 항상 감사드립니다.

    카메라 조립과정에서 오차로 인해 렌즈와 이미지 센서의 수평이 어긋나면 여러 Intrinsic 패러미터들이 바뀔 수 있다고 설명해주셨는데요, 제 생각엔 '렌즈와 이미지 센서의 수평이 어긋난 경우'를 사실 근본적으로 핀홀카메라 모델만으로 표현할 방법이 없다고 생각하는데, 이를 보완하기 위한 다른 카메라 모델이 있는지, 해당 모델에 맞는 캘리브레이션 방법이 또 따로 존재하는지 궁금합니다.

  • 코코 2021.08.02 10:46 ADDR 수정/삭제 답글

    이미지센서의 cell이란 표현에서 cell 이 무엇을 말하는 것인지 궁금합니다!

    • BlogIcon 다크pgmr 2021.08.02 12:58 신고 수정/삭제

      셀은 이미지 센서에 집적되어 있는 photo diode(광학 다이오드)를 말합니다. 일정한 시간 동안 축적된 광량을 전기적 값(intensity)으로 변환시키는 역할을 합니다.

  • 조로악크 2021.08.03 16:41 ADDR 수정/삭제 답글

    안녕하세요! 다크프로그래머님!

    처음 카메라 칼리브레이션이 무엇인지 알아보고 공부한 덕에 실제 칼리브레이션 모델을 구현할 수 있게 되었습니다. 감사합니다.

    현재 제가 큰 직사각 물체 (ex. 탁구대)를 칼리브레이션하려고 A4 용지 4*11 원형 격자를 이용하였습니다. 그래서 탁구대의 테두리를 4*11 원형 격자 A4 용지 세로 방향으로 모두 사진을 찍어서 칼리브레이트를 했습니다. 그 결과 모두 drawchessboard()가 되었고, 그 결과로 카메라 내부 행렬과 왜곡 계수를 구했습니다만....
    그렇지만 잘 칼리브레이션되었는 지 확인 하기 위해 cv2.ProjectPoints를 활용해서 오차를 구했습니다만..
    error가 9000% 가 떴습니다.
    최종적으로 궁금한 것은 어떻게 하면 error를 잘 줄일 수 있는지가 궁금합니다.
    참고로 A4 용지와 카메라 사이 거리는 대략 1.3m입니다. 그리고 조명은 키지 않는 상태입니다.

    • BlogIcon 다크pgmr 2021.08.03 22:22 신고 수정/삭제

      안녕하세요. 여러 원인이 있을 수 있기 때문에 말씀만으로 원인을 짐작하기는 어렵습니다. 일반적인 말씀 밖에는 못 드리며, 카메라 캘리브레이션용 사진은 가급적 가까이서, 그리고 가급적 다양한 각도에서 촬영하면 좋습니다. 물론 사진을 찍기 전에 카메라의 초점거리는 원하는 물체와의 거리로 고정시켜 놓아야 합니다. 그리고, 가끔 보드판(A4 용지)을 수직으로만 사진을 찍는 경우가 있는데, 그러면 캘리브레이션이 되지 않습니다. 반드시 측면(사선)에서 찍은 사진이 포함되어야 합니다.

    • BlogIcon 조로악크 2021.08.04 23:59 수정/삭제

      안녕하세요! 다크 프로그래머님!
      정말로 Camera Calibratino의 대가 라고 할 수 있을 정도로 정말로 큰 도움을 받고 있습니다.

      앞서 올려 주었던 오차 (사실 처음에는 12000% 까지 나왔습니다 ㅠㅠ)가 9000% 였다고 했었는 데 선생님이 알려주신 조언대로 차근차근 조금씩 오차를 줄여나가 최소 오차는 40%까지 올라간 상태입니다.
      그리고 사진을 좀 더 추가해서 지금은 오차가 56%까지 도달하게 되었습니다.
      진심으로 감사합니다.

      그렇지만 이렇게 오차가 56% 로 되었으나 camera calibrate한 결과로 x,y,z 즉, 이동하는 물체의 직교좌표계를 구하려고 하는 데 좀 많이 심할까요?

      또한, 실시간으로 칼리브레이션을 통해 구한 카메라 내부 행렬, 왜곡계수 등 그런 값을 토대로 실시간으로 칼리브레이트한 결과를 영상으로 보았는 데 탁구대 모서리 양쪽이 좀 오목해진 결과를 보았는 데 오목해진 것을 좀 더 평평하게 만드는 방법은 없을까요? 오차를 줄이는 것과 일맥상통한 말일까요?

      오차를 줄이기 위한 시도, 더 평평해지기 위한 시도로는
      -모든 A4용지(4*11 원형격자가 그려진)로 다양한 각도로 모든 면을 커버쳐서 이미지를 캡쳐하였습니다.
      -조명도 켰습니다.
      -모든 것을 거의다 수평으로 맞추려고 했습니다.

      정말 큰 도움을 받고 있습니다. 항상 감사합니다!