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

영상처리 2013.02.01 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).



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 다크 프로그래머

  • 이전 댓글 더보기
  • Oh 2018.07.05 15:03 ADDR 수정/삭제 답글

    안녕하세요 이번에 stereo vision에 대해 공부하다가 depth를 구하는 과정에서 카메라가 평행하게 놓여있는경우와 약간 각도를 가지게 되는 경우에 대해 두개의 차이점에 대해 궁금해서 이렇게 글을 남깁니다. 두개의 경우에서 depth를 구하는데 정확도의 차이가 있는지 어느 것이 더 선호되는지 궁금합니다.

    • BlogIcon 다크pgmr 2018.07.08 16:34 신고 수정/삭제

      안녕하세요. 스테레오 쪽에 대해서는 잘 알지 못하지만 카메라가 평행하게 놓인 경우를 선호하는 것으로 생각됩니다. 스테레오 캘리브레이션을 하게 되면 두 이미지 평면을 서로 평행하게 변환해서 처리하기 때문에 큰 차이는 없겠지만 어쨌든 평행한 것이 나을 것 같습니다. depth 추정 정확도 측면에서는 차이가 (전혀?) 없을 것으로 생각됩니다..

  • TigerStone 2018.07.09 18:01 ADDR 수정/삭제 답글

    축 왜곡[radial distortion]과 접선 왜곡[tangential distortion]은 내부 변수에 해당하나요 아니면 외부 변수에 해당하나요?혹은 둘 다 해당하지 않는 또 다른 범주인가요?

    • BlogIcon 다크pgmr 2018.07.10 11:27 신고 수정/삭제

      보통 어디에도 끼지는 않지만, 내부 파라미터에 속한다고 보는게 맞을 것 같습니다.

  • 모느 2018.07.12 14:29 ADDR 수정/삭제 답글

    저 카메라영상처리 공부중인데요 컴퓨터비젼 책 추천좀 해주시면 안될까요?

    • BlogIcon 다크pgmr 2018.07.13 18:41 신고 수정/삭제

      어떤 컴퓨터비전 책이 좋은지는 저도 잘 모릅니다. 다만, 제가 예전에 봤던 책은 Gonzalez의 Digital Image Processing이라는 책과 Jain, Kasturi, Schunck의 Machine Vision이란 책입니다. 아마도 영상처리 및 비전에 관한 고전적인 책으로 생각됩니다. 한 20년 전쯤에 봤던 책들인데, 컴퓨터 비전에 대한 기본적인 공부를 익히기에는 나쁘지 않은 책들로 생각됩니다.

  • 윤구 2018.08.17 16:53 ADDR 수정/삭제 답글

    안녕하세요 영상처리 관련하여 공부하고 있는 학생입니다. 캘리브레이션 과정에 대해 궁금한 부분이 있습니다. 혹시 캘리브레이션 하는 과정에 있어서 카메라를 고정한 후 체크보드 판을 움직여 얻은 결과와 체크보드판을 고정한 후 카메라를 움직여서 결과는 얻는 방법 중 어느것이 맞는건지 혹은 어떤 차이가 있는지 궁금합니다.

    • BlogIcon 다크pgmr 2018.08.17 23:13 신고 수정/삭제

      아무런 차이가 없으니 어떤 방법으로 해도 좋습니다.

  • ghanjang 2018.10.11 09:16 ADDR 수정/삭제 답글

    안녕하세요 다크님. 항상 좋은 글 감사합니다.
    본문에서 해상도가 1/2로 줄면 cx, cy, fx, fy가 모두 1/2로 준다고 하셨는데, 이는 resizing 할 경우의 parameter 변화를 의미하신 것 같습니다. 여기에서 두 가지 궁금한 점이 있어서 글을 남깁니다.
    1. image를 임의의 size로 crop 할 경우, calibration parameter들이 각각 어떻게 변화하는 지 궁금합니다.
    예를 들어, 100x100 image에서 구한 parameter를 cx, cy, fx, fy라고 할 때, [좌상단 (20,20), 우하단(40,40)으로] 20x20 image로 cropping 했을 경우, calibration parameter는 어떻게 변할까요?
    2. 또한 resizing과 crop이 extrinsic parameter에 변화를 줄까요?

    • BlogIcon 다크pgmr 2018.10.11 19:59 신고 수정/삭제

      안녕하세요. crop할 경우에 fx, fy는 변화가 없고 cx, cy는 cx - 20, cy - 20으로 변합니다. extrinsic은 카메라의 위치 및 자세를 나타내는 것인데, 당연히 변하지 않습니다.

  • 학생 2018.10.28 20:09 ADDR 수정/삭제 답글

    안녕하세요, 다크님의 글로 캘리브레이션을 공부하고 있는 학생입니다.
    같은 과정을 사진 왜곡 보정에 적용하고 싶은데,
    이렇게 체크 보드로 구한 왜곡보정을 다른 사진에도 그대로 적용할 수 있나요?

    • BlogIcon 다크pgmr 2018.10.29 13:27 신고 수정/삭제

      네, 사진에도 동일하게 적용할 수 있습니다. 사진이나 이미지나 같은 것이니까요.. 어쨌든 동일한 카메라와 동일한 설정으로 촬영한 사진에 대해서는 동일한 파라미터를 적용할 수 있습니다.

  • 정말고맙습니다 2018.11.12 22:15 ADDR 수정/삭제 답글

    안녕하세요, 포스팅을 통해 매번 도움 받고 있는 학생입니다.
    포스팅 내용 중 일부 및 사진을 정리하고 있는 포스팅에 활용해도 괜찮을까요?
    개인적인 학습 목적이며 출처를 표시할 예정입니다.
    답변 부탁드립니다.

  • BBSIZ 2018.11.19 15:37 ADDR 수정/삭제 답글

    안녕하세요, 다크프로그래머님 글 잘 보고 있습니다. 항상 감사합니다.
    본문에서 사용한 calibration 방법은 체커보드를 사용하셨는데, Structured light를 사용한 calibration 방법과 무슨 차이가 있고 어떤 것이 더 사용하기 편리한지 장단점을 알 수 있을까요? (https://youtu.be/ILb5ExBzHqw?t=63) <-Structured light를 사용한 calibration의 예

    • BlogIcon 다크pgmr 2018.11.28 12:26 신고 수정/삭제

      여기 있는 글은 카메라를 캘리브레이션 하는 내용이고, structured light는 (잘은 모르지만) 카메라와 프로젝터 둘 사이의 캘리브레이션을 위한 것이 아닌지요..

  • BlogIcon jongseonk 2018.11.26 22:28 ADDR 수정/삭제 답글

    안녕하세요. 다크프로그래머님.
    카메라 캘리브레이션과 관련해서 정말 많은 도움 받았습니다. 감사합니다.
    (다크 라는 말이 왠지... 달빛조각사 다크게이머가 생각나네요 ㅋ) 늘 건승하세요.

    • BlogIcon 다크pgmr 2018.11.28 12:30 신고 수정/삭제

      네, 달빛조각사에도 다크라는 캐릭터가 나오고 묵향에도 다크가 나옵니다. ^^

  • 감사_압도적감사_ 2018.11.27 17:17 ADDR 수정/삭제 답글

    오늘도 감사합니다

  • BlogIcon 자화이 2019.01.20 00:39 신고 ADDR 수정/삭제 답글

    캘리브레이션 이미지 획득과정에서 오토포커스를 꺼야한다고 읽었습니다.
    실제 카메라 활용시에는 오토포커스On이 필요한 경우에는 그 때 발생하는 오차는 어쩔수가 없는 것이겠죠?

  • 산마로 2019.04.26 17:41 ADDR 수정/삭제 답글

    질문이 있습니다. 영상 처리 관련 초보자입니다. 작성해놓으신 문서를 보고 많이 배우고 있습니다.
    카메라 캘리브레이션을 opencv를 이용해서, 카메라 Matrix와 disortion coefficient를 구한 후 원본 이미지를 보정된 이미지로 바꾸는 것까지는 테스트를 했습니다.기울어진 건물이 그래도 기울어진 것이 보정된 것 처럼 보입니다.

    그런데, 혹시 위 두개의 측정값을 이용해서, 단순히 왜곡이미지의 특정 이미지 좌표들이, 보정이 되어서 보정된 이미지의 어느 좌표에 매칭되는 지 알 수 있는 쉬운 방법이 있는지 궁금합니다.
    위키피디아의 lens distortion 페이지에서 software correction 식에 측정된 값을 사용하면 구할 수 있을까요?

    • BlogIcon 다크pgmr 2019.04.27 23:02 신고 수정/삭제

      opencv 함수들 중 cv::undistortPoints 함수를 이용하면 간단하게 보정된 좌표를 구할 수 있습니다.

  • rkfaorl1994 2019.04.30 02:33 ADDR 수정/삭제 답글

    안녕하세요~ photogrammetry 공부중인 학생입니다. 블로그의 글들이 많은 도움이 됩니다.
    다름이 아니라, focal length 에서 fx 와 fy가 따로 나타나는데, square pixel이 아니라 rectangular pixel의 경우에 이를 general하게 cover하기 위해 따로 구하는 것이고, 현재 통상의 카메라에선 fx=fy=f 로 두어도 상관없다는 내용을 확인했습니다.
    하지만, 여기서 궁금한 점은, 정확하게 어떤 원리로 인해 sensor의 pixel이 photo의 한 pixel에 1:1 대응되는 건가요? sensor의 pixel이 사람이 만드는거라, 정확히 square가 될 수가 없어서 fx, fy를 따로두는 것인가요? 아니면 sensor의 한 pixel은 square인데, 여러픽셀은 한묶음으로 영상좌표계의 한 pixel에 대응시킴에 따라 가로세로 비율이 달라지기 때문인가요?
    한글로 된 자료나 서적이 전무하여, 그리고 제 지식이 부족하여 여기에나마 질문을 남깁니다..ㅠ

    • BlogIcon 다크pgmr 2019.04.30 10:31 신고 수정/삭제

      이미지 센서에는 포토다이오드 셀들이 격자형태로 집적되어 있는데(100만화소 카메라는 100만개 셀이 존재) 포토다이오드 셀이 픽셀에 해당합니다. 이 때, 셀과 셀의 배치 간격이 가로방향(x축)과 세로방향(y축)이 동일하면 fx = fy = f로 잡을 수 있습니다. 즉, sensor의 셀의 형태가 square인지 여부가 아니라 그들의 배치 간격이 더 중요한 요소라 볼 수 있습니다.
      sensor의 셀과 이미지의 pixel이 1:1 대응되는 원리는 광학계를 이해해야 하는데요,... https://darkpgmr.tistory.com/107 글의 <그림2>를 참조하시면 좋을 것 같습니다.

    • rkfaorl1994 2019.04.30 10:49 수정/삭제

      답변 감사드립니다.
      https://darkpgmr.tistory.com/107 글의 <그림2> 를 확인해 보았지만, sensor의 셀과 이미지의 pixel이 어떻게 대응되는 건지 잘 모르겠습니다.. 말씀하신 그림은 단순한 광학이 아닌가요? 가르침이 필요합니다 ㅠㅠ
      또한, 주점 cx cy의 단위 또한 pixel인가요? 여기서의 pixel은 문맥상 sensor array의 한 pixel에 해당하는 것 같은데 맞나요? -> 앗, 이부분은 답글에 있네요 pixel 단위가 맞군요

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

      rkfaorl1994님, 제가 질문을 잘못 파악한 것 같네요.. 좀더 정리를 해서 문의글을 남기면 저도 답변하기 좋을 것 같습니다. 센서에서 이미지로의 변환은 https://darkpgmr.tistory.com/97 글을 참조하시기 바랍니다.

    • rkfaorl1994 2019.04.30 16:25 수정/삭제

      두서없는 질문 죄송합니다.. 아직 개념이 정확하게 잡혀있지 않은 듯 합니다. 현재 모션캡쳐 관련하여 공부중인 학생입니다. 카메라로 찍은 영상 혹은 이미지 좌표 (u,v) 로부터 3차원좌표 (x,y,z) 를 재건축하는 것이 필요한데, 이를 위해선 이미지 좌표 (u,v)가 이미지 센서 상의 (u,v) 인지 아니면 jpg 파일 상의 (u,v) 인지 정확히 알 필요가 있습니다.
      1. 블로그의 좌표계에 관한 글을 참고한 결과, 본문에서 언급되는 이미지좌표 혹은 영상좌표 라는 공간은 저희가 컴퓨터로 보는 jpg 파일의 pixel 좌표임을 알 수 있습니다. 하지만, pinhole model의 그림에서 묘사되는 영상좌표는 sensor 의 pixel로 보입니다. 정확하게 둘중 무엇인가요?
      2. Sensor pixel 이든 Image pjxel 이든, 가로세로의 비율이 달라 fx fy 를 구분짓는 것이 이해가 잘 되지 않습니다. 본문의 내용에 충실하여 생각해보면, 다음과 같이 생각할 수 있는데요;
      1) Sensor pixel 과 Image pixel 둘중 하나가 직사각형 pixel을 가질 수 있어 이를 보상하기 위함이다.
      2) Sensor pixel 도 정사각형이고, Image pixel도 정사각형인데, Sensor pixel 하나와 Image pixel 하나의 1:1 매칭이 아니라, Sensor pixel 여러개와 Image pixel 하나의 매칭으로 인해 비율 차이가 생기므로, 이를 보상해주기 위함이다.
      3) 덧글에서 언급해주셨듯, sensor pixel array의 배치 간격에 따라 가로세로 비율이 달라져, 이를 보상하기 위함이더. 하지만 이 경우, 배치간격이 정확하게 어떻게 이루어지길래 비율을 따로줘야하는 경우가 생기나요? 애초에 배치간격이 다를 이유가 무엇인가요?
      질문을 어느정도 정리해봤습니다.

  • 러너 2019.05.28 10:35 ADDR 수정/삭제 답글

    안녕하십니까, 다크프로그래머님.

    좋은 글 포스팅 해주셔서 감사합니다.

    하나 궁금한것이 있어 여쭈어보려고 하는데요.

    3d 상의 한 점을 카메라로 찍었을 때, 2d 상의 어떤 점으로 대응되는지 구하는 것이 아닌, 단순 모양의 크기를 가늠하려고 할 때에도 켈리브레이션 여부가 영향을 미칠까요?

    ( 이미지 크기 픽셀 수 x 픽셀 크기 ) * (초점 거리 / 렌즈와 물체 사이의 거리 )로 원본 이미지 크기와
    비교해보았는데, 차이가 생겨 혹시 카메라 캘리브레이션에 의해 영향이 있을까하여 질문 드립니다.

    • BlogIcon 다크pgmr 2019.05.28 23:20 신고 수정/삭제

      러너님이 사용하신 수식은 어떻게 유도된 것인지 모르겠네요.. '이미지에서의 물체의 크기(픽셀 수) : 실제 물체의 크기 = 초점거리 : 렌즈와 물체 사이의 거리'의 비례식으로 한번 풀어보시기 바랍니다.

  • BlogIcon 오뚜깅 2019.06.03 17:16 신고 ADDR 수정/삭제 답글

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

    영상처리 쪽에서 갓 공부중인 대학원생입니다. 늘 공부하면서 구글링할 때 자주 들려서 도움을 받곤 합니다.

    이번에 캘리브레이션으로 영상 투영 작업을 할 일이 생겨서 다크프로그래머님 글을 참고 하기도 하였는데요. 제가 조금 어려운 상황에 봉착해서 몇 가지 여쭤볼까합니다.

    제가 작업하고 있는 환경은 어떤 3D 맵 지도(포인트 클라우드 정보로 이루어진)가 있고, 그 지도를 만들 때 찍어두었던 카메라 이미지들이 있는 상태입니다.

    주어진 정보들은 3D 맵 지도의 포인트 클라우드 정보(UTM52N 좌표계 상의 좌표들), UTM52N 좌표계를 따르는 매 이미지 시퀀스마다 카메라가 사진을 찍은 카메라의 위치 좌표, internal orientation, external orientation 파일입니다.

    위의 자료들은 카메라의 제조 업체로부터 건너건너 받은 자료들이라 여러 파라미터들의 정확한 의미를 알지 못하지만, 제가 파악한 파라미터들은 intrinsic 파라미터와 extrinsic 파라미터의 rotation 행렬 값입니다.

    extrinsic 파라미터의 translation 파라미터 값은 현재 모르는 상태인데요..

    이 상황에서 제가 접근하려고 하는 게 다크님이 위의 포스팅에서 기입해주신 intrinsic, extrinsic 파라미터 행렬 곱을 사용하려고 합니다.

    그런데 문제가 여기서 translation 벡터 값을 모르는 상태라.. 단순히 translation 벡터에 카메라의 위치 좌표 값을 넣어주기도 하고, 카메라 좌표와 포인트 클라우드의 좌표값을 단순히 빼준 값을 넣어주기도 하면서, translation 벡터 값을 추정(?)(그냥 때려맞추기 식이죠..)을 하고 있거든요..

    이 상황에서 어떻게 접근해야하는지 모르겠어서.. 혹시 제가 위의 글에서 이해하지 못한 부분이 있어서 이렇게 헤매이는 거라면, 어떤 글을 참조해야할지 알려주시면 감사하겠습니다. 아니면 어떤 식으로 방향을 잡아야하는 지 여쭤봐도 좋을까요..

    • BlogIcon 다크pgmr 2019.06.04 14:20 신고 수정/삭제

      translation 벡터를 t, 카메라 rotation 행렬을 R, 카메라 위치(월드좌표)를 p라 하면 t = -R*p 관계가 성립합니다. https://darkpgmr.tistory.com/77 글과https://darkpgmr.tistory.com/122 글을 읽어보시면 좋을 것 같습니다.

  • BlogIcon 오뚜깅 2019.06.13 14:21 신고 ADDR 수정/삭제 답글

    다크님, 덕분에 translation 벡터를 찾아서 3d point cloud를 카메라 좌표계로 잘 변환해준 뒤 projection을 성공했습니다.. 근데 한 가지 더 여쭤보고 싶은데요.. 단순히 intrinsic, extrinsic 행렬 곱으로 3d 좌표들을 카메라 평면으로 투영시켜주고나면 좌우 반전이 일어나고, 이미지 해상도도 이상하게 일정한 간격으로만 픽셀값들이 나타나고 나머지 영역에는 투영되지 않는 현상이 나타납니다.. 도무지 원인을 알 방법이 없네요. 좌우 반전은 왜 일어난 것이며, 해상도는 왜 저렇게 나오는지 여쭙고 싶습니다..
    이미지는 첨부하겠습니다.. 감사합니다 꾸벅..
    https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fk.kakaocdn.net%2Fdn%2Fbaa4pc%2Fbtqv3JfZ1m4%2Ft17uaAvCoeB7GWN8kZpO90%2Fimg.png

    • BlogIcon 다크pgmr 2019.06.13 16:43 신고 수정/삭제

      그건 저로서도 알 방법이 없네요.. 구현하신 분만이 알수 있는 문제라서요. 차분히 원인을 찾아보는 방법 밖에는 없을 것 같습니다.

    • BlogIcon 오뚜깅 2019.06.13 19:12 신고 수정/삭제

      넵..! 감사합니다.!!

  • 대학원 2019.07.03 15:39 ADDR 수정/삭제 답글

    다크님 안녕하세요, visual servoing 을 공부하고있는 학생입니다.
    많은 도움이 되고있습니다. 먼저 감사인사 올리겠습니다. 여쭤보고싶은것이 있는데,
    focal length에 관련한 내용입니다. 데이터시트상 카메라렌즈의 focal length가 0.008[mm]로 나옵니다.
    헌데, GML camera calibration toolbox 를 이용하여 내부파라미터들을 측정했을때, focal length가 1567x1570 정도로 나옵니다. 이때 focal length 의 단위가 본문에서 말하는것 처럼 [pixel]값인지 궁금합니다. 또, Sensor Size 가 3.7mm x 2.8mm 로 나옵니다 (데이터시트에) 그럼 위에 언급하신 말처럼 focal length[pixel] x Sensor size[mm] = focal length[mm] 가 나와야 한다고 이해했는데 데이터시터의 focal length와 많은 차이가 나서 어떤 오류있는지 잘 모르겠습니다.
    혹시 GML 프로그램에 나타나는 focal length 단위가 [pixel] 인지 [m](미터) 인지 알려주실수 있나요?
    항상 도움이 되는 글 잘 보고있습니다. 감사합니다.

    • BlogIcon 다크pgmr 2019.07.03 15:48 신고 수정/삭제

      물리적인 focal length가 0.008 mm이면 너무 짧은 것 아닌가요? focal length는 렌즈와 이미지센서와의 거리인데, 아무리 초소형 카메라 하더라도 그렇게 가까울 수는 없을 것 같습니다.. 그리고 GML toolbox에서 나오는 값은 pixel입니다. 또한, focal length[pixel] x Sensor size[mm] = focal length[mm] 식에서 Sensor size는 이미지센서 전체의 크기가 아니고 센서를 구성하는 셀(cell) 하나의 크기여야 합니다.

  • 대학원 2019.07.03 16:15 ADDR 수정/삭제 답글

    답변 감사합니다. 물리적 focal length 는 8mm였습니다. 번거롭게해서 죄송합니다,
    아 센서 사이즈를 제가 잘못이해하고있었군요, 이제 이해가 갔습니다.
    저같은 분들을 위해 정리해보자면,
    GML에서 얻을 수 있는 focal length의 단위는 [pixel] 이며 단위를 mm로 변환하기 위해

    focal length [mm] = focal length[pixel] /해상도 * 이미지센서의 크기
    focal length [mm] = focal length[pixel] * 이미지센서를 구성하는 셀(cell)하나의 크기
    로 정리 할 수 있겠군요. 감사합니다. 정리가 확 되네요.

    또하나 여쭤보고싶은게 있는데, 658x452 해상도를 가진 카메라를 사용하고 있는데
    principal point를 구했을때 cx : 343 cy:160 정도의 주점들이 나오는데 물리적인 주점과 큰 오차를
    보이는데 이 정도 데이터시트값과의 오차라면, 신뢰성이 떨어지는 값 즉, 캘리브레이션이 잘 안됐다고 판단할 수 있나여?
    위에 답변감사합니다.

    • BlogIcon 다크pgmr 2019.07.03 17:47 신고 수정/삭제

      네.. 캘리브레이션이 잘못된 것 같습니다.

  • 대학원 2019.07.14 21:42 ADDR 수정/삭제 답글

    위에 이어 질문하나만 드리겠습니다.

    GML 칼리브레이션 하여 Focal length가 1436[pixel],1436[pixel] 이 나왔고 데이터시트상 해상도는 658x492 , size of image sensor는 3.7x2.8 [mm]입니다.
    focal length를 mm단위로 환산하였을때 6.11 x 10.8 정도의 값이 나옵니다.
    데이터 시트상의 focal length는 8mm입니다.
    pixel단위의 focal length가 같은데 mm단위의 focal length는 큰 차이가 나는데 이것은 기계적인 요소의 차이가 만든거라고 볼 수 있을까요? 아니면 캘리브레이션 및 계산과정에서 오류가 나왔던걸까요?

    • BlogIcon 다크pgmr 2019.07.15 10:05 신고 수정/삭제

      계산이 잘못된 것 같습니다. focal length가 1436 pixel이라는 의미는 렌즈에서 이미지 센서까지의 거리가 이미지 센서 셀(cell) 크기의 1436배라는 의미입니다. fy(mm) = 3.7mm / 658 * 1436 = 8.07, fx(mm) = 2.8mm / 492 * 1436 = 8.17입니다.

  • 대학원 2019.07.15 21:20 ADDR 수정/삭제 답글

    아 저 계산식에 의하면 제대로 나오는군요, 허나 궁금한게
    fy를 구할때 492가 아닌 658이 나누어지는지 여쭤봐도 될까요?
    X축이 658 Y축이 492의 해상도를 가졌는데 어떻게 저렇게 되는지 궁금합니다.
    궁금증을 해결해주셔서 감사합니다.