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

영상처리 2013.02.01 16:59

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




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는 camera matrix입니다.




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


식(1)에서 [R|t]를 카메라 외부 파라미터(extrinsic parameter), A를 내부 파라미터(intrinsic parameter)라고 부릅니다.


카메라 외부 파라미터는 카메라의 설치 높이, 방향(팬, 틸트) 등 카메라와 외부 공간과의 기하학적 관계에 관련된 파라미터이며 내부 파라미터는 카메라의 초점 거리, 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 등)와의 거리를 말합니다.





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


참고로, 동일한 카메라에 대해 캘리브레이션을 수행했을 때, 해상도를 1/2로 낮추면 캘리브레이션 결과의 초점거리도 1/2이 됩니다. 실제 물리적 초점거리가 변하는 것은 아니고, 해상도를 낮춤에 따라 한 픽셀 당 물리거리의 비가 변하기 때문에, 동일한 물리 초점거리를 나타내기 위한 픽셀 수가 줄어드는 것입니다.


초점거리를 하나의 값으로 f라 표현하지 않고 fx, fy로 구분한 이유는 이미지 센서의 물리적인 셀 간격이 가로 방향과 세로 방향이 다를 수 있음을 모델링 하기 위함입니다. fx와 fy의 비율인 fy/fx를 aspect라 부르는데, 만일 aspect ≠ 1 인 경우에는 영상에서 픽셀거리가 동일하더라도 이것이 가로방향의 거리인지, 세로방향의 거리인지에 따라서 실제 물리적인 거리가 달라집니다. 만일, fy > fx라면 y방향의 1 픽셀 거리가 x방향의 1 픽셀 거리보다 실제로는 더 작은 (물리거리) 값입니다.


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


초점으로부터 거리가 1(unit distance)인 평면을 normalized image plane이라고 부르며 이 평면상의 좌표를 보통 normalized image coordinate라고 부릅니다. 물론 이것은 실제는 존재하지 않는 가상의(상상의) 이미지 평면입니다. 카메라 좌표계 상의 한 점 (Xc, Yc, Zc)를 영상좌표계로 변환할 때 먼저 Xc, Yc를 Zc(카메라 초점에서의 거리)로 나누는 것은 이 normalized image plane 상의 좌표로 변환하는 것이며, 여기에 다시 초점거리 f를 곱하면 우리가 원하는 실제 영상좌표(pixel)가 나옵니다 (아래 그림 참조). 카메라 초점거리가 왜 픽셀(pixel) 단위로 표현되는지, 핀홀 카메라 모델이 무엇인지 좀더 이해가 되었으면 합니다 ^^.




=> 초점거리에 대한 보다 자세한 내용에 대해서는 [영상처리] - 카메라의 초점거리(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α).



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


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



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


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


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


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


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



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


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


그림출처: 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




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


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


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



캘리브레이션 결과는 위 예와 같이 추정치 ± 추정오차(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/




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



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


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


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

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

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



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


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



관련 포스팅


by 다크 프로그래머

저작자 표시 비영리 변경 금지
신고
  • 이전 댓글 더보기
  • BlogIcon 홍초아 아빠 2016.09.12 16:35 신고 ADDR 수정/삭제 답글

    물체의 크기를 알고 있는 상태에서, 카메라 위치를 바꿔가며 촬영을 한 후 각 이미지로부터 카메라와 물체까지의 거리를 각각 구하려고 한다면....(이때 물체를 항상 정면에서 촬영한다는 가정하에 있습니다, 즉 기울여 촬영하지 않는다?)

    1) 각 카메라 위치마다 초점거리, 주점이 변화되는데 이 때의 캘리브레이션은 어떻게 해야하나요?
    (추측) 표준캘리브리션으로 해당 카메라의 초점거리 구간을 다수개로 나누고 각 구간에서의 이미지 좌표(주점에서 x, y)를 데이터화하고, 추후 크기를 아는 물체의 이미지 좌표에 대응하는 초점거리값을 사용?

    2) 본문 내용 및 Q&A를 보면 체스보드 또는 특정패턴의 다수 이미지로만 캘리브레이션 해야하나요?
    아니면 특정 물체의 크기 및 물체들 상호간의 상대위치를 알고 있는 경우 이들의 다수 이미지를 사용해서도 가능할 까요?

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

      카메라의 auto focusing 기능을 끄면 카메라의 초점거리, 주점이 변하지 않습니다. 그래서 컴퓨터 비전 작업을 할때는 보통 auto focusing 기능을 꺼놓고 사용합니다. 만일 auto focusing 기능이 반드시 필요하다면 auto focus가 되더라도 초점거리 등이 크게 변하지 않는다고 가정하고 오차가 있더라도 한 지점에서 구한 카메라 파라미터를 동일하게 적용할 수는 있습니다.
      그리고 카메라 캘리브레이션 방법은 한가지만 있는 것은 아니니 말씀하신 방향으로도 가능한 방법이 있을 수 있다고 생각합니다. 다만 그러려면 스스로 수식 모델링이 가능해야 할 것입니다..

  • BlogIcon 홍초아 아빠 2016.09.12 17:16 신고 ADDR 수정/삭제 답글

    카메라 내부 파라미터중 주점(Cx, Cy)는 말씀하신대로 "카메라 조립오차로 인해 렌즈와 이미지 센서가 수평이 어긋나는 경우 발생하는 것으로 주점과 영상중심이 다를 수 있다"라면 각 카메라의 주점은 초점거리가 변화해도 해당 카메라의 주점은 항상 일정한 건가요? 만약 그렇다면, 카메라의 주점은 딱 한번의 캘리브레이션으로 결정될 수 있는 건가요?

    • BlogIcon 다크pgmr 2016.09.12 17:41 신고 수정/삭제

      저도 직접 실험해본 것은 아니니 정확한 것은 모릅니다. 하지만 초점거리가 변하면서 기구적으로 렌즈 위치가 변하기 때문에 주점에도 변화가 있을 것이라 생각합니다.

    • BlogIcon 홍초아 아빠 2016.09.12 17:43 신고 수정/삭제

      네 알겠습니다. 항상 오차와 변화를 염두에 두어야 겠군요... 감사합니다.

  • 저다 2016.10.14 17:14 신고 ADDR 수정/삭제 답글

    안녕하세요, 다크프로그래머님의 블로그는 항상 잘 보고있습니다. 요즘 제가 체스보드의 격자들의 크기를 측정하는 프로그램을 만들어보고있습니다. 여기서 openCV의 FindchessboardCorners라는 메소드를 이용해 각 코너들을 검출하려합니다.
    제가 사용하는 시편은 30*30의 격자들이 있습니다. 하지만 무슨이유때문인지 위의 메소드가 null값을 토해냅니다. 이틀째 이문제를 해결하지 못해 이렇게 문의드립니다.

    • BlogIcon 다크pgmr 2016.10.15 00:25 신고 수정/삭제

      가끔 실패하는 경우도 있으니 깨끗한 체스판 이미지로 해보고 격자의 수를 정확하게 입럭했는지도 체크해 보시면 좋을것 같습니다.

  • 3dscan 2016.10.30 23:46 신고 ADDR 수정/삭제 답글

    안녕하세요 3d scan을 위해 카메라 칼리브레이션을 공부하고있습니다 제가근데
    카메라가 그냥 카메라인데 계산할때 이것도 카메라핀홀도 방법으로 좌표계산하나요

    • BlogIcon 다크pgmr 2016.10.31 09:14 신고 수정/삭제

      네, 약간의 오차가 발생할 수는 있지만 일반적인 카메라는 모두 핀홀 모델로 근사해서 사용합니다.

  • 요다 2016.11.14 17:06 신고 ADDR 수정/삭제 답글

    안녕하세요. 늘 잘 보고 있습니다.
    위의 항목 중 '8. 캘리브레이션 팁' 에서
    " 패턴 영상의 개수는 4개 이상이면 캘리브레이션이 가능하지만 많을수록 좋으며 .."
    에 대한 이유나 아니면 근거자료가 혹시 있을까요?

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

      경험적으로 영상의 수가 4개 이상이 되었을 때 실제 파라미터 값에 근접한 값이 나오는 것 같습니다. 논문에는 2개 또는 3개부터 캘리브레이션이 가능하다고 되어 있는 것 같은데 자세한 내용은 논문을 보시기 바랍니다: Z. Zhang, A flexible new technique for camera calibration, IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000.

    • 너를위한노래 2016.12.15 09:41 신고 수정/삭제

      입력되는 영상 개수에 따라 연립방정식(논문에서는 행렬의 차수) 개수가 결정되고 이에 따라 구할 수 있는 파라미터 개수가 정해지는 것 같습니다~
      논문에서는 입력 영상이 2개면 파라미터 2개만 정확히 구해지고 나머지는 정해진 값을 쓴다고 나와있네요

  • 학생하잿 2017.01.05 14:39 신고 ADDR 수정/삭제 답글

    안녕하세요 카메라 캘리브레이션을 진행함에 있어서 좋은 정보 잘 얻고 갑니다.
    그런데 궁금증이 하나 있는데요. 내부 파라미터를 고정한 상태에서 촬영한 같은 이미지들에 대해서 올려주신 GML,DarkCal, Matlab으로 수행한 결과가 초점거리나 주점에 대해서 캘리브레이션 툴에 따라 10픽셀 이상의 차이가 발생하는데 어떤 결과를 신뢰해서 사용해야 할지 판단할 방법이 있을까요? Matlab은 패턴의 코너를 직접 마우스로 클릭한 거라 신뢰도가 높다고는 할 수 없을 것 같습니다.
    또한 같은 툴을 쓰더라도 촬영한 이미지가 다르면 결과의 차이가 꽤나 크게 나오는데 예를 들어 5.6마이크로미터 픽셀 CCD 기준으로 캘리브레이션 결과의 초점 거리가 1120~1140정도까지 변화를 보입니다. 렌즈 공식으로 계산해 보면 렌즈로부터 초점이 맺히는 거리까지가 12cm~18cm정도 범위에서 사용한 이미지에 따라 변하는 것을 알 수 있는데 이 정도 오차는 감안해야 하는 정도인가요?

    • BlogIcon 다크pgmr 2017.01.05 17:27 신고 수정/삭제

      원래 선무당이 사람 잡는다고 잘 모르는 내용을 답변하려니 어렵네요.. 카메라 캘리브레이션 방법이 최적화 기법으로 근사해를 찾는 것이라서 정확히 정답을 찾는다기 보다는 그때 그때 주어진 입력에서 최선의 해를 찾는다고 생각됩니다. 그런데, 우리가 캘리브레이션에서 사용하는 카메라 모델이 실제 카메라를 완벽하게 모델링 할 수 있는 모델이 아니다 보니 입력 영상에 따라서, 그리고 최적화 기법에 따라서 결과가 조금씩 달라지는 것 같습니다. 일단은, 캘리브레이션을 돌리고 나면 pixel error (DarkCal에서는 rms)라는 것을 반환하는데 이것이 가장 작은 결과를 선택하면 좋을 것 같습니다.

  • 학생하잿 2017.01.06 16:07 신고 ADDR 수정/삭제 답글

    답변 감사합니다 ^^ 구글에서 영어로 된 설명만 찾다가 한글로 친절하게 써주신 것 보고 정말 도움이 많이 됐습니다. ^^ 다시 한 번 감사합니다~

  • 나그네 2017.01.12 18:15 신고 ADDR 수정/삭제 답글

    영상처리와 관련 기하학 자료를 검색하다가 우연히 발견하게되었는데, 정말 훌륭해서 그냥 지나가는 것은 도리가 아니라고 생각해서 글을 남깁니다.
    관련 자료들을 체계적이고 아주 정성스럽게 정리해서 이렇게 모두가 공유할 수 있도록 홈페이지에 업로드해주셔서 감사합니다.
    앞으로도 좋은 잘를 꾸준히 올려주시면 고맙겠습니다. 애독자 드림

    • BlogIcon 다크pgmr 2017.01.13 15:56 신고 수정/삭제

      별말씀을요.. 감사합니다 ^^

    • 학부생 2017.08.01 00:35 신고 수정/삭제

      공감해요! 정말 잘 읽었습니다
      너무너무 감사해요!!

  • 서재민 2017.03.01 00:06 신고 ADDR 수정/삭제 답글

    그래서 캘리브레이션 하는이유는 뭔가요??

    • BlogIcon 다크pgmr 2017.03.01 19:20 신고 수정/삭제

      저울의 오차와 변화를 제거하기 위해 영점을 조정하듯이 카메라의 캘리브레이션도 이미지가 형성되는 과정에 있어서 카메라의 기구적 영향을 제거하기 위한 과정입니다. 카메라 캘리브레이션을 하는 이유는 영상의 기하학적 해석과 밀접한 관련이 있으며 카메라 영상으로부터 원래의 3차원 공간정보를 복원하기 위해서입니다. 예를 들어 자동차에 장착된 카메라로부터 전방의 자동차까지의 거리를 알아내고 사물의 크기를 알아내기 위해서는 카메라 캘리브레이션 과정이 선행되어야 합니다.
      카메라 시점이 달라지면 영상이 달라짐은 누구나 아는 사실입니다. 이를 역으로 생각하면 촬영된 영상으로부터 카메라의 시점을 복원하거나 또는 물체의 3차원 정보를 복원할 수 있다는 의미가 됩니다. 하지만, 그러기 위해서는 카메라 영상에 대한 일관된(표준화된) 기하학적 해석이 가능해야 합니다. 그런데, 한 가지 문제가 있습니다. 그건 촬영에 사용된 카메라의 종류, 렌즈의 종류 및 곡률, 센서의 감도, 센서의 해상도 등 다양한 기구적 특성에 따라서 동일한 장면을 동일한 위치에서 찍어도 서로 다른 이미지가 얻어질 수 있다는 점입니다. 따라서 이미지 형성에 있어서 카메라의 기구적인 영향을 제거하고 표준화된 기하학적 해석을 위해서는 먼저 카메라의 기구적 특성을 알아내서 제거해야 할 필요가 있습니다. 그리고 카메라의 기구적 특성 즉, 카메라 파라미터를 찾아내기 위한 일련의 작업(과정)이 카메라 캘리브레입니다.

  • Dancingwith 2017.04.06 13:27 신고 ADDR 수정/삭제 답글

    안녕하세요 Opencv 다룬지 이제 막 한달 되어가는 학생입니다.
    카메라에 찍힌 공의 x,y 좌표를 3D 좌표로 바꾸고싶은데요...
    현재 체스보드를 통해 카메라의 파라미터를 알아내긴 했습니다 그런데 그다음에 어떻게 해야할지 모르겠네요..ㅠㅠ
    혹시 어떤 과정이 필요한지 간략하게나마 알려주실 수 있을까요?

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

      카메라 1대로는 3D 좌표를 얻어낼 수 없는 것 아닌가요? 3D 좌표를 얻어내려면 카메라를 2대 사용해야 합니다 (스테레오 카메라).

  • landing 2017.04.12 09:46 신고 ADDR 수정/삭제 답글

    안녕하세요.

    Dancingwith님 댓글에서 3D좌표를 얻기 위해 카메라 2대 사용해야하는 이유는 무엇인가요?

    제가 위 포스팅을 읽고 물체의 3D좌표를 얻는 과정에 대하여 이해한 바로는,
    =====
    1. calibration tool을 통해 카메라 매트릭스 A를 구한다.
    2. 월드좌표[X,Y,Z]-영상좌표[x,y] 쌍을 통해 [R|T] 매트릭스를 구한다.
    3. 이를 수식(1)에 적용해 (x,y)로부터 (X,Y,Z)를 구해 3D의 물체와 카메라 간 거리 혹은 물체 크기 등을 얻는다.
    =====

    포스팅 [영상의 기하학적 해석 - 영상의 지면 투영(ground projection)]에서 보면 카메라 1대로는 물체의 2D좌표인 지면좌표만(?) 찾을 수 있는 것 같은데요..

    수식(1)에서 월드좌표계는 3D이기 때문에 물체의 3D좌표를 찾을 수 있다고 생각한거랑 상반되어 혼란이 옵니다.

    2대 사용하여 3D좌표를 구하는것은 어느 포스팅에서 도움을 받을 수 있을까요? 그리고 혹시 카메라 2대 대신 카메라와 레이더를 1대씩 이용하는 것도 가능한지요.

    질문이 많은데 미리 감사드립니다.

    • BlogIcon 다크pgmr 2017.04.12 19:31 신고 수정/삭제

      아시겠지만 빛이 카메라에 맺혀서 이미지가 생성됩니다. 그리고 그 빛(ray)을 따라서 존재하는 모든 점들은 모두 같은 한 점으로 투영됩니다. 따라서 이미지 점을 가지고 원래의 3차원 점을 복원하는 것은 불가능합니다. 이미지 점에서 3D 점을 복원하기 위해서는 부가적인 정보가 필요합니다. 예를 들어 거리(depth) 정보 등이 필요합니다. 만일 카메라가 2대라면 삼각법을 이용해서 3D점까지의 거리(depth)를 구할 수 있습니다. 이러한 카메라를 스테레오 카메라라고 부릅니다. 본 블로그에는 삼각법 계산하는 구체적인 수식에 대한 글은 아직
      없습니다. 그리고 레이더는 카메라 없이도 그 자체로 3d 좌표가 나오는 것 아닌지요?

  • wk 2017.06.20 14:08 신고 ADDR 수정/삭제 답글

    안녕하세요 한가지 질문이 있어 댓글 남깁니다.
    현재 depth 카메라 캘리브레이션을 하고있습니다.
    우선 RGB 영상 캘리브레이션을 통해 intrinsic 과 coefficient 를 구하였고
    depth 영상 또한 구하였습니다.

    여기까지 완료가 되었다 하더라도, RGB와 depth 간의 extrinsic (R|t) 정보가 없다면,
    RGB의 (u,v) 좌표와 depth의 (u,v) 좌표가 같지 않을것 같은데, 맞나요..?

    • BlogIcon 다크pgmr 2017.06.20 16:05 신고 수정/삭제

      저는 depth는 안써봐서.. 아마 다를 것 같은데요, 둘 사이를 어떻게 캘리브레이션을 하는지는 잘 모르겠네요.

  • spector 2017.07.23 23:36 신고 ADDR 수정/삭제 답글

    안녕하세요.
    image plane 2d 좌표에서 world 좌표로 컨버팅하는 부분에대해 질문이 있습니다.

    월드좌표 Pw=[X,Y,Z]라고 했을때 이걸 camera coordinate system 으로 바꾸려면
    Pc=R*Pw+T 이고 이걸 카메라 intrinsic matrix를 이용해서 image plane으로 바꿀때
    Pc=[Xc,Yc,Zc] ->Pc'=[Xc/Zc, Yc/Zc, 1]=[Xc',Yc',1](식 a) 로 바꿔서 normalized image plane
    으로 보낸 후 Pi=[u,v]=K*Pc' 을 이용해서 이미지 좌표로 보내시잖아요?
    여기까지는 이해 했는데
    제가 영상의 이미지 좌표 Pi=[u,v]를 world cooridnate system으로 바꾸고 싶은데
    단안 카메라로 영상을 취득후 제가 알수 있는건 영상 좌표 Pi=[u,v]이고
    이걸 camera coordinate 으로 보내려면
    Pc'=inverse(K)*Pi where Pi =[u,v,1]
    이렇게 하면 된다고 이해했습니다.
    그런데 world coordinate 을 camera cooridnate으로 바꿀때 저는 위식(식 a)에서 Pc ->Pc'으로 바꾸는 과정에서 Pc=[Xc,Yc,Zc] 으로 Zc으로 나눈후에 intrinsic을 곱했는데 역으로 갈때는
    inverse(K)*Pi=Pc'는 구했는데 Pc'->Pc으로 어떻게 바꿔야 할지 모르겟습니다.
    월드에서 이미지로 올때는 Zc로 나눠줬는데 카메라 영상좌표만 가지고 Zc를 어떻게 복원해서
    Pc'->Pc로 바꿀수 있나요?

    • BlogIcon 다크pgmr 2017.07.24 08:26 신고 수정/삭제

      안녕하세요. 많이들 혼동스러워 하는 부분인데 결론은 '복원할 수 없다'입니다. 3차원의 점을 이미지에 투영는 것은 이 점과 카메라 원점을 잊는 직선이 이미지 평면과 만나는 교점을 구하는 것입니다. 그런데, 이 직선 위에 있는 모든 점들은 모두 동일한 이미지 좌표로 투영됩니다. 따라서, 이미지 좌표로부터 3차원 좌표를 복원하는 것은 수학적으로는 불가능합니다. 따라서, 이미지로부터 3차원 정보를 복원하기 위해서는 스테레오 카메라 등과 같은 삼각 측량법의 원리가 필요합니다.

  • BlogIcon DRAGONITE 2017.08.02 18:20 신고 ADDR 수정/삭제 답글

    안녕하세요 좋은 글 정말 감사합니다^^! 모든 카메라가 캘리브레이션 작업이 필요한 것인가요? 현재 노트북 웹캠으로 실험을 진행해보려합니다.. 올려주신 자료에는 보정전과 후의 동영상 파일이 많이 다른 것이 느껴집니다만, 대부분의 카메라가 보정전에 왜곡이 심한가요?

    • BlogIcon 다크pgmr 2017.08.03 15:13 신고 수정/삭제

      대부분의 웹 카메라는 굳이 왜곡 보정은 필요없다고 생각됩니다. 그런데, 카메라 캘리브레이션의 목적은 왜곡 보정보다는 대부분 영상을 기하학적으로 해석하기 위해서입니다. 예를 들어, 카메라 영상으로부터 물체의 3차원 정보를 복원하기 위해서는 카메라 파라미터(초점거리, 주점, 왜곡계수 등...)가 필요하고 이러한 파라미터를 구하기 위해 캘리브레이션을 수행합니다.

    • BlogIcon DRAGONITE 2017.08.03 16:00 신고 수정/삭제

      목적이 왜곡 보정보다는 대부분 영상을 기하학적으로 해석하기 위함이군요! 도움 주셔서 감사드립니다^^!

  • sampard 2017.08.10 13:09 신고 ADDR 수정/삭제 답글

    안녕하세요. 카메라 캘리브레이션 관련하여 행렬 연산에서 헷갈리는게 있어서 댓글 남깁니다..! LM = 0 행렬 연산에서 L은 12x12 이고 M은 12x1 행렬입니다. 이때, M이 0 이외의 다른 값을 가질 수가 있나요?

    • BlogIcon 다크pgmr 2017.08.10 13:38 신고 수정/삭제

      네 가질 수 있습니다. 식 Ax = 0가 있다고 했을 때, A의 역행렬이 존재하지 않으면 Ax = 0을 만족하는 0이 아닌 x가 존재합니다. 이러한 x는 A를 특이분해(singular value decomposition)했을 때, 0인 특이값(singular value)에 대응하는 특이벡터(singular vector)가 존재합니다. 특이값 분해에 대해서는 http://darkpgmr.tistory.com/106 글을, Ax = 0의 0이 아닌 해를 구하는 방법에 대해서는 http://darkpgmr.tistory.com/108 글을 참조하시기 바랍니다.

  • minx 2017.08.17 18:44 신고 ADDR 수정/삭제 답글

    영상 정보를 바탕으로 촬영한 피사체의 azimuth angle과 elevation angle을 계산해보려하는데, 다크프로그래머님의 글을 정말 많이 참고하고있습니다.

    현재 Gopro Hero4를 사용하고 있고, FoV를 Linear로 설정하여 캘리브레이션을 진행했습니다.
    일단 다른거 사용하지 않고 매트랩에 내장되어있는 어플리케이션을 사용했는데요,
    Optical Center를 표시할 때 픽셀좌표계의 원점을 어디에 두는가가 좀 중요하더군요.
    이미지의 픽셀좌표계의 원점을 좌상단으로 많이 두는것 같던데, 매트랩 내장 어플은 이부분에 대한 언급이 없네요...
    혹시 다크프로그래머님께서 직접 만드신 프로그램은 위에 이미지에 있는 좌표계들을 사용하여 만드셨는지요?

    • BlogIcon 다크pgmr 2017.08.18 11:48 신고 수정/삭제

      네, 픽셀좌표계의 원점은 항상 이미지의 좌상단 모서리로 잡습니다.

  • 쏘쏘 2017.08.21 13:11 신고 ADDR 수정/삭제 답글

    변환 관계 모델링식에서 필요한 내용인 내부파라미터(A), 회전/이동변환 행렬, 월드좌표계를 아는데 식대로 곱하였을때 스케일 값이 곱해진 이미지좌표가 나와야하는 것 같은데 왜 이상한 값이 나올까요?
    제가 뭔가 잘못 이해한 것인지.. 계산에 실수가 있었던 것인지 궁금합니다.

    • BlogIcon 다크pgmr 2017.08.21 13:30 신고 수정/삭제

      만일 약간의 오차가 난 정도라면 렌즈 왜곡보정이 포함되지 않아서이고, 오차가 전혀 엉뚱한 값으로 나온다면 계산에 실수가 있었거나 R, t 행렬의 값이 잘못 계산되었을 것으로 생각됩니다. 계산 과정에 문제가 없는지 하나씩 확인해 보시면 좋을 것 같습니다. 그리고 식 (1)은 렌즈 왜곡이 고려되어 있지 않습니다. 따라서, 광각카메라 등 영상왜곡이 심한 경우에는 왜곡 보정도 해야 합니다. 왜곡 보정에 대해서는 http://darkpgmr.tistory.com/31 글과 http://darkpgmr.tistory.com/77 글을 참고하시면 좋습니다.

    • 쏘쏘 2017.08.22 21:09 신고 수정/삭제

      감사합니다 매칭 값을 잘못넣어서 외부파라미터에 문제가 생긴 것 같더라구요.
      도로 탑뷰를 만들고 싶은데 식 1에서 s값이 스케일(배율)이라고 알고 있었는데 월드좌표를 입력해서 s가 곱해진 값을 받으면 s값이 매번 일정해야하는거 아닌가요? s값이 정확히 어떤 것을 의미하나요? 검색을 해보니까 다른 식에서는 s 자체를 생략했더라구요..

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

      식 1에서 s는 그냥 스케일 상수이긴 한데, 굳이 해석을 하자면 s = 1/depth (depth는 카메라와 물체와의 z 거리)입니다. 따라서, 카메라로부터 멀리 떨어진(depth가 깊은) 점들에 대해서는 s가 작은 값이 나오고, 가까운 점들은 s가 높은 값이 나옵니다.

  • 질문있습니다. 2017.09.27 10:33 신고 ADDR 수정/삭제 답글

    내부파라미터는 카메라의 고유값이고 외부파라미터는 고유값이 아니라고 했는데 그럼 카메라의 위치 변화에 따라 발생하는 내부파라미터 변화는 최적화과정에서의 변화로 크게 신경쓰지 않고 고정된 값으로 사용해도 무방한가요??

    • BlogIcon 다크pgmr 2017.09.27 13:11 신고 수정/삭제

      카메라의 오토 포커싱 기능이 켜져 있을 경우는 파라미터가 변하지만 그렇지 않은 경우는 고정값을 사용하면 됩니다.

  • 자연산흑곰 2017.11.16 19:19 신고 ADDR 수정/삭제 답글

    '초점거리를 하나의 값으로 f라 표현하지 않고 fx, fy로 구분한 이유는 이미지 센서의 물리적인 셀 간격이 가로 방향과 세로 방향이 다를 수 있음을 모델링 하기 위함입니다' 라고 하셨는데
    여기서 나오는 '셀'이 어떤건지 이해가 안갑니다 ㅠㅠ

    질문 1) 이미지 센서에 대하여 구글링 해보니 CMOS에 나오는 셀인것 같은데 이것이 세로방향으로 많으면 이미지도 세로방향으로 더 정밀하게 받아들일수 있다고 이해하면 될까요??

    질문 2) 질문을 어떻게 해야할까 생각해보다가 그냥 직관적으로 적어보겠습니다.
    응?fx, fy는 뭐지? -> 그렇다면 일반적인 포컬렝스는 fz가 되겠지? ->
    포컬렝스 fz는 이미지 센서와 렌즈까지의 거리니깐 z축에 따라 움직이는 값 ->
    그럼 fx, fy는 x축 y축으로 움직이는건가? -> 읭? fx,fy는 셀에 따라 다르게 적용된다고? ->
    그러면 fz는 셀의 두께를 나타내는건가? -> 그럼 내가 아는 fz는 다른 의미였나?? -> 셀의 두께에 따라 렌즈 거리가 달라지는건가?? ->!@#@~$~@$$

    제가 이해한대로라면 영상좌표계의 x좌표는
    Xcam = (Fx*Xw) + Cx(밑첨자를 구분하기 위해 위해 대문자를 섞었습니다)인지
    아니면 Xcam = (F*Xw) + Cx 인지 잘 모르겠습니다. Fx와 Fy의 존재를 어떻게 받아들여야 할지 잘 모르겠습니다

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

      혹시 카메라 내부를 본 적이 있으신지요? 안에 이미지 센서가 있는데 이미지 센서는 격자 형태의 셀의 배열로 이루어져 있습니다. http://titerced.blog.me/100043573606 에 있는 동영상을 보신 후 http://darkpgmr.tistory.com/97 글도 같이 읽어보시면 이해에 도움이 될 것 같습니다.
      질문 1) -> 네 그렇습니다.
      질문 2) -> 초점거리(f)는 물리적으로 이미지 센서와 렌즈 중심까지의 거리입니다. 이 거리를 픽셀단위로 바꾸기 위해 이미지 센서의 가로 방향 셀 간격(물리적 간격)으로 나눈 값이 fx입니다. 그리고 세로 방향 셀 간격으로 나눈 값이 fy 입니다. fz라는 것은 따로 없습니다. ^^
      일단 여기까지 보시고 또 추가적으로 궁금한 사항이 있으면 질문 주세요.

    • 자연산흑곰 2017.11.17 18:21 신고 수정/삭제

      자주 느끼는것중 하나가 '이해했던 내용을 두가지로 나누는것은 정말 어렵다' 입니다. 여태 카메라 캘리브레이션은 곧 lens distortion을 제거한 영상이라고 생각했었는데 다른것이였네요....
      나름 서칭해가며 공부를 해본 결과 링크(https://kr.mathworks.com/help/vision/ug/camera-calibration.html?s_tid=gn_loc_drop)에서 나온것같이 캘리브레이션을 진행하려면 3D좌표와 이에 대응하는 2D 좌표를 알고 있어야 합니다. 저도 그렇게 생각하는것이 실제 영상 좌표와 월드 좌표가 변환행렬을 통하여 계산되었을때 어느정도 수긍할만한 범위 안에서 결과값이 같아야 할테니깐요. 여기서 궁금한것이 3D월드 좌표는 어떻게 알아내야 하는것입니다. 실제로 자를 가지고 거리를 재야하는지, 아니면 다른 방법이 있는지 궁금합니다!

    • BlogIcon 다크pgmr 2017.11.18 15:26 신고 수정/삭제

      네, 그래서 캘리브레이션을 할 때에는 미리 크기를 알고 있는 체스판 등을 사용합니다. 체스판의 평면을 z = 0인 평면, 한쪽 꼭지점을 원점, 그리고 체스 격자 크기를 미리 알고 있으면 격자 꼭지점들의 월드 좌표를 계산할 수 있습니다.

  • 비숍 2017.11.23 20:10 신고 ADDR 수정/삭제 답글

    안녕하세요.
    저는 비젼 분야는 아니지만 RS/GIS 분야에서 일을 하면서 어렵게 알게 되었던 내용을 이렇게 쉽게 정리해 주시니 존경스럽네요. 아직도 모르는 것이 많아 이곳에서 큰 도움을 받고 있습니다. 오랜기간 동안 꾸준히 블로그를 관리하시는 것도 대단하시고요. 감사합니다.^^