카메라의 초점거리(focal length)

영상처리 2013.10.23 11:06

예전에 카메라 캘리브레이션에 관한 글([영상처리] - 카메라 캘리브레이션 (Camera Calibration))을 쓰면서 카메라의 초점거리(focal length)를 렌즈초점에서 이미지 센서까지의 거리라고 설명했는데 최근 이게 아님을 깨닫게 되었습니다.


새로 깨닫게 된 것은 카메라 초점거리(focal length)는 렌즈에서 이미지 센서까지의 거리라는 것입니다.


왜 그런지 간단히 설명해 보겠습니다.


먼저, 컴퓨터 비전에서 말하는 카메라의 기본모델은 아래 그림과 같은 핀홀(pinhole) 카메라 모델입니다.


<그림 1> pinhole 카메라 모델 (그림출처: 위키피디아)


핀홀 카메라 모델은 말 그대로 외부의 상이 하나의 바늘구멍을 직선으로 통과하여 반대편 벽(이미지 센서)에 맺힌다는 모델입니다. 그리고 여기서 카메라 초점거리(focal length)는 바늘구멍에서 뒷 벽면까지의 거리로 정의됩니다.


이제 핀홀 카메라 모델을 렌즈-이미지센서로 대응시켜 생각해 보겠습니다.


볼록렌즈의 기본 성질은 렌즈에 수평으로 들어온 빛은 모두 렌즈 초점(focus)을 통과한다는 것입니다. 또한 렌즈의 중심(center)을 통과하는 빛은 굴절없이 그대로 직진하게 되며 렌즈 중심에서 멀어질수록 굴절이 심해진다는 점입니다. 이러한 내용을 그림으로 나타내 보면 아래와 같습니다.


<그림 2> 렌즈-이미지센서 투영


그림을 잘 보면(특히 나무의 위 끝부분) 렌즈에 수평으로 들어온 빛은 렌즈의 초점을 통과하여 이미지 센서에 투영되고 렌즈의 중심을 지나는 빛은 그대로 투과하여 이미지 센서에 맺힙니다. 그런데 빛은 모든 방향으로 퍼져 나가기 때문이 이 두 방향뿐 아니라 그림의 빨간색 선들처럼 다양한 방향으로 렌즈를 투과하여 상이 맺히게 됩니다. 그런데, 중요한 점은 이들 빛들이 모두 한점 (렌즈 수평한 빛과 렌즈 중심 통과한 빛이 만나는 점)으로 모이게 되며 이 만나는 점에 이미지 센서가 위치하면 가장 선명한 상을 얻을 수 있다는 점입니다 (제가 물리쪽에는 자신이 없어서 확신은 못하지만 대략 이럴 것이라 추정하고 있습니다). 위 그림에서 이미지 센서를 좀더 앞으로 이동시키거나 뒤로 빼면 빛이 흩어지기 때문에 블러링(blurring)이 생김을 쉽게 상상할 수 있습니다.


우리가 보통 선명한 이미지를 얻기 위해 카메라의 초점거리를 조절하는 것이 이 원리라고 생각하면 됩니다.


원래 문제로 돌아가서,

<그림 1>의 핀홀 카메라 모델과 <그림 2>를 비교해 보면 핀홀 모델에서는 빛이 바늘구멍을 직선으로 투과하여 반대편에 상이 맺힙니다. 그런데, <그림 2>를 보면 빛이 렌즈초점을 직선으로 지나는 것이 아니라 렌즈중심을 직선으로 투과하여 이미지 센서에 맺히는 것을 알 수 있습니다. 따라서, 렌즈중심이 핀홀에 대응되기 때문에 카메라의 초점거리는 렌즈중심에서 이미지센서까지의 거리로 정의하는 것이 맞겠습니다.


by 다크 프로그래머


저작자 표시 비영리 변경 금지
신고
  • BlogIcon 무중력고기 2013.10.25 11:58 신고 ADDR 수정/삭제 답글

    보통 요즘 카메라 렌즈에는 렌즈가 하나만 들어가는 경우가 없지요. 제가 예전에 관련 책을 얼핏 읽었던 기억으로는.. 그 렌즈군 중에서도 2번 렌즈인가?? 중심이 되는 렌즈가 있다고 합니다. 그 렌즈의 광학적 중심에서 이미지센서까지의 거리를 초점거리라고 정의하더군요. 그림을 곁들인 자세한 설명 잘 봤습니다. ^^

    • BlogIcon 다크pgmr 2013.10.28 08:16 신고 수정/삭제

      좋은 정보 감사합니다. 저도 사실 디카 내부 구조도 등을 찾아봤지만 엄청 많은 렌즈들이 조합되어 있더군요. 앞으로는 2번 렌즈라는게 어떤 건지 주의깊게 봐야겠습니다. 제가 몸담고 있는 영상처리 쪽에서는 수학적 모델링이 쉽도록 그냥 한점(바늘구멍)을 투과하여 상이 맺히고 이 점에서 센서까지의 거리를 초점거리라 정의합니다. 그런데 이게 실제 물리적인 렌즈들과 매칭을 시켜보려면 참 난감하기 그지없습니다 ^^;

  • BlogIcon 학생 2013.10.27 17:30 신고 ADDR 수정/삭제 답글

    유익한 글 잘 읽었습니다. 제가 요즘 실험을 하다가 매우 궁금한 부분이 하나 생겨서 질문을 드리고자 합니다. 먼저 실험해본 내용은 다음과 같습니다.

    줌렌즈를 사용하는 카메라로 줌을 5단계로 나누어 calibration을 했습니다. 그런다음 intrinsic parameter 중 focal length를 mm 스케일로 변환하였더니 다음과 같이 나왔습니다.
    (각각의 배율당 Re-projection error는 0.2정도로 작은편이었습니다.)

    zoom1 : 9.2375mm / 2: 9.7723mm / 3: 10.2691mm / 4: 10.8511mm / 5: 11.4902mm //

    mm로 변환할땐 fx (pixel) * 3.75um/pixel 로 계산하였으며 fx 값은 카메라 CCD 전체 면적을 사용하는 최대해상도인 1280x960으로 calibration하여 얻은 focal length 이고, 3.75um/pixel 은 카메라의 CCD 스펙에 적혀있는 값입니다. 1/3" CCD 카메라의 가로길이가 4.8mm 이므로 1280화소로 나누어도 같은 값을 가집니다.
    여튼 intrinsic을 구한 다음 카메라와 chessboard를 일정 간격 (약 10 cm) 정도 떨어뜨려 놓고 둘다 움직이지 않게 고정한 다음 배율만 바꿔가며 해당 배율의 intrinsic값을 대입하여 extrinsic parameter를 구해보니 extrinsic 의 z값의 변화가 다음과 같이 나타났습니다.

    zoom1 : 118.366mm / 2: 121.460mm / 3: 123.997mm / 4: 127.058mm / 5: 130.816mm //

    문제는 보시는바와 같이 intrinsic의 증가량과 extrinsic의 증가량이 약 5.5배나 차이가 난다는 것입니다. 이론상으로는 focal length의 길이와 동일한 scale로 extrinsic parameter가 변해야 하는데, 이렇게 차이가 난다는 것은 무엇이 문제일까요? 위에서 설명하신대로 focal length가 CCD 면으로 부터 principal point까지의 거리가 아니라 렌즈중심이라 해도, extrinsic parameter를 계산할때 똑같은 focal length를 가지고 계산해야 하기때문에 이부분의 오류는 아닐것 같습니다만..
    도무지 해결이 안되어 여쭤봅니다.

    • BlogIcon 다크pgmr 2013.10.28 10:13 신고 수정/삭제

      오히려 제가 배워할 할 것 같은데요 ^^
      어쨌든 나름 답변을 해 보면,
      먼저 extrinsic z가 무엇이고 어떻게 계산한 것인지 궁금합니다. 만일 카메라에서 체스판까지의 거리를 extrinsic z라 놓고 구한 것이라면, 그리고 fx:영상에서의x축방향체스판크기 = z:실제체스판크기 로 z를 계산한 것이라면 배율에 관계없이, 그리고 fx 값에 관계없이 z는 항상 동일한 값이 나와야 한다고 생각합니다. intrinsic은 카메라에 따라 변하는 값이지만 extrinsic은 카메라의 위치와 방향과만 관계된 값입니다. 그리고 이러한 계산방식은 렌즈왜곡이 없다는 가정하의 계산이므로 보다 정확한 z의 계산은 먼저 렌즈왜곡을 보상한 normalized image 좌표를 구한 후에 비례식을 풀어야 합니다.

    • BlogIcon 학생 2013.10.28 12:37 신고 수정/삭제

      아, 죄송하게도 자세한 설명을 적어놓질 않았네요. 위에서 말씀드린 extrinsic parameter의 z란 체스보드와 카메라의 translation 값 중 z값을 말한 거였습니다. 즉 실험을 통해 봤을 때 카메라와 체스보드간의 x,y 좌표변화는 거의 없지만 (체스보드에 대해 카메라가 수직방향이 되게 위치시켰습니다) z는 줌의 변화에 따라 바뀌게 됩니다. 그런데 이 z값의 변화폭이 intrinsic의 focal length의 변화폭과 다르다는 말이었습니다. ^^; 혹시나 제가 실험했던 자료가 필요하시다면 말씀해 주세요. 메일로 보내드릴게요.

    • BlogIcon 다크pgmr 2013.10.28 16:29 신고 수정/삭제

      나름 답변을 드렸다고 생각합니다만..
      z를 어떤 식으로 계산했는지 그리고 z값이 focal length와 같이 변해야 되는 이유에 대해 설명을 부탁드려도 될까요?

    • BlogIcon 학생 2013.10.28 17:07 신고 수정/삭제

      extrinsic parameter는 카메라와 체스보드간의 transformation인데, 이때 카메라 center와 chessboard의 기준좌표계 (보통 0,0 위치의)까지의 위치와 방향이라 정의하는데요, 그러면 카메라의 center란 물리적인 초점의 위치라고 생각했습니다.
      즉 3차원 공간상에서의 principal point와 focal length는 mm스케일로 표현될수 있으며 camera의 center를 나타내는 한 점이라고 생각했습니다. 카메라에서 CCD는 당연히 움직이지 않으므로, 배율에 따라 변하는것은 principal point와 focal length이며 그렇다면 물리적인 camera의 center 또한 배율에 따라 변하는 것이라 보고, 결국 camera의 center가 변하므로 카메라와 체스보드간의 z축 거리가 변한다고 봤습니다. 여기에서 어떤 오류가 있나요? 제가 camera의 center란 개념을 잘못 이해하고 있는건지요?

      (카메라의 center를 계산할 땐 OpenCV의 solvePnp 함수나 calibration합수의 결과에 나오는 camera to image 행렬의 tx,ty,tz값을 이용했습니다. )

    • BlogIcon 다크pgmr 2013.10.29 09:29 신고 수정/삭제

      네 잘 알겠습니다.
      z를 구하는 과정에 대해 제가 아는 바를 말씀드리면 먼저 영상좌표를 normalized 좌표로 변환한 후에 왜곡을 보정하고 이후 extrinsic z를 계산합니다. 만일 물체의 영상좌표를 x, 초점거리를 fx라면 normalized 좌표는 x' = x/fx가 됩니다 (왜곡은 무시한다고 가정). 그런데, normalized 좌표는 z=1일 때를 기준으로 한 좌표이기때문에 원래 물체의 공간좌표를 X라 하면 X:x/fx = Z:1을 푼 Z가 extrinsic z가 됩니다. 즉, X는 고정이고 Z = X * (fx/x)으므로 Z는 fx/x에 비례합니다.
      실험하신 바와 같이 zoom을 높이면 초점거리 fx는 증가하고(물리적인 초점거리가 변화) 더불어 영상좌표 x도 zoom만큼 증가합니다. 실험한 내용을 보면 zoom 레벨에 따라 fx는 약 1.056 배씩 증가하고 extrinsic z는 약 1.026배씩 일정하게 증가함을 볼 수 있습니다. 만일 영상의 zoom이 1.056/1.026배씩 증가했다면 Z = X*(fx/x)에서 Z도 1.026배씩 증가하게 될 것입니다.
      실제 영상 zoom 변화가 이와 같을지는 모르겠습니다. 영상왜곡도 영향을 받겠지요. extrinsic z와 focal length는 증가량이 아닌 증가비율로써 비교하는게 좋을 것 같습니다.

    • BlogIcon 학생 2013.10.29 15:25 신고 수정/삭제

      아! 이제 이해가 됩니다 ^^ 식을 단순화 시켜 계산해보니 그렇게 되는군요. 답변 정말 감사합니다!

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

      다행입니다. 저도 덕분에 줌 변화시 특성에 대해 많이 배웠습니다 ^^

  • halfling 2013.10.28 11:12 신고 ADDR 수정/삭제 답글

    무중력 고기님이 언급하신 내용에 덧붙이자면 렌즈의 내부에 제2주점 (principal point)이라는 곳이 있습니다. 렌즈를 정의하는 가상의 면인데요 그 제2주점과 이미지 센서 혹은 필름면까지가 카메라 렌즈의 초점거리가 됩니다. 자세하게 설명한 블로그가 있네요.. 한번 들어가 보세요..^^
    http://blog.naver.com/candyflip?Redirect=Log&logNo=80133032440

    • BlogIcon 다크pgmr 2013.10.28 16:28 신고 수정/삭제

      좋은 정보 감사합니다. 덕분에 렌즈 초점 거리에 대해 좀더 확실하게 이해하게 되었습니다 ^^. 복잡하게만 보였던 일련의 다수 렌즈들을 하나의 가상 렌즈로 모델링하는 것이 인상깊었습니다. 그리고 제가 생각한 초점거리 모델이 틀리지 않아서 다행입니다.

  • BlogIcon 붕대마음 2014.03.15 10:05 신고 ADDR 수정/삭제 답글

    안녕하세요. ^^a. 좋은 정보 감사드립니다. 간단한 질문이 있어서 글을 남기게 되었습니다.
    위에서 언급하고 있는 카메라의 초점거리(focal length)가 아래 링크의 공식에서 말하는
    "L"의 값으로 생각하면 될까요?
    http://books.google.co.kr/books?id=NG9Ly3GdnTwC&pg=PA92&lpg=PA92&dq=near+focus+limit+HxD&source=bl&ots=5OTNkyaFQf&sig=lBZjomr1fHSCXceL5BA4fU7fQPs&hl=ko&sa=X&ei=s6MjU9jnOKT_iAepj4GIBg&ved=0CCkQ6AEwAA#v=onepage&q=near%20focus%20limit%20HxD&f=false

    참고 : shader for game programmers and artists. page 92.


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

      네 설명을 읽어보니 L이 초점거리가 맞는 것 같습니다

  • 궁금한학생 2016.07.27 11:27 신고 ADDR 수정/삭제 답글

    안녕하세요. 다크pgrm님의 좋은 글들 읽으며 공부하고 있는 학생입니다. 궁금한 점이 하나 생겼는데 혹시 답변해주신다면 정말 감사하겠습니다!

    1. 디지털 카메라의 줌 상태는 건드리지 않고 Autofocus 기능만 활용하여 다양한 거리에서 특정 피사체를 촬영한다면, 초점거리는 변화하게 되는게 맞는 건가요? 이 때의 초점거리는 물리적 초점거리 인가요?
    2. 카메라 캘리브레이션편에서 말씀하신 물리적 초점거리와 픽셀당 물리거리비 변화를 나타내기 위한 초점거리의 차이가 헷갈리는데 좀 더 설명해주실 수 있으실까요?

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

      카메라의 초점거리는 렌즈중심과 이미지 센서 사이의 거리이며 이 정의 자체는 변하지 않습니다. 다만 초점거리는 다양한 단위로 표현될 수 있는데 mm 등의 물리적 단위로 표현될 수도 있고 pixel 단위로 표현될 수도 있습니다. 픽셀은 결국 이미지 센서의 셀에 대응되기 때문에 예를 들어 초점거리가 35 픽셀(pixel)이라면 이는 초첨거리가 이미지 센서의 셀 간격의 35배라는 의미입니다.

    • 궁금한학생 2016.08.11 17:30 신고 수정/삭제

      답변 감사합니다!

      초점거리의 정의에 대한 궁금증이 해결되었습니다만, 여전히 궁금한 점이 있어 다시 질문 드립니다. (번거롭게 하여 정말 죄송합니다..)

      제가 궁금한 점은, 오토 포커싱 기능이 카메라에 내장되어 있는데, 사람이 촬영 위치를 이동함에 따라 오토 포커싱 기능을 통해 피사체에 초점을 잡으면 카메라 내부에서는 초점 거리를 조절하여 피사체의 초점을 잡는 것 인가요? 아니면 초점 거리는 일정한 것인가요? 검색해봐도 명확히 설명되 있는 글이 없는 것 같아서 다크pgrm님께 문의드립니다..

    • BlogIcon 다크pgmr 2016.08.11 21:59 신고 수정/삭제

      초점거리가 변하는 것으로 알고 있습니다.

    • 궁금한학생 2016.08.16 16:01 신고 수정/삭제

      답변 감사합니다 ^^

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

    "줌 vs 초점거리"에 대한 질문 있습니다.
    다크pgmr님과 학생님의 Q&A를 쭉 살펴보다 궁금한 게 있어서요... 기하학적으로 보면, zoom단계를 변화시키면서(즉 렌즈의 위치를 변경) 카메라 센터(렌즈 중심)의 변화와 초점거리의 변화를 본 실험같은데요. 여기서 전 아래와 같은 혼란스러움이 생기네요.

    초점거리가 증가하면 즉 카메라 내의 렌즈가 이미지 센서와 멀어지므로 extrinsic z(카메라 센터~체스보드 중심점)가 감소하지 않나요? 헤깔리네요.

    • BlogIcon 다크pgmr 2016.09.12 15:12 신고 수정/삭제

      네.. 말씀하신 것처럼 extrinsic z가 줄어드는게 맞다고 생각합니다. 말씀하신 부분은 지금 다시 보니 질문도 이해가 안가고 제가 한 답변도 잘 이해가 안갑니다.. ㅠ.ㅠ 왜 그런 답변을 주고 받았을까요..

  • 학생하잿 2017.03.22 15:01 신고 ADDR 수정/삭제 답글

    안녕하세요 올초에 질문 남겼었는데 다른 궁금증이 생겨 질문 다시 남깁니다.
    본문을 보니 "초점이 맺히는 곳과 이미지 센서의 거리가 아니라 렌즈의 중심과 이미지 센서의 거리"라고 되어있고 댓글을 보니 "여러 렌즈로 이루어진 렌즈의 경우 중심이 되는 렌즈가 있다", " 광학적 중심은 여러 렌즈의 제2주점이다" 라고 되어 있네요 정리해보면 ' 초점거리의 기준이 되는 두 가지 좌표 중 이미지 평면은 이미지 센서가 맞고' ' 나머지 카메라 좌표계의 중심은 여러 렌즈 중 중심이 되는 렌즈의 광학적 중심'이라고 이해 했습니다. 그렇다면 질문이 있습니다.
    저는 실제 크기를 알고 있는 물체를 찍어서 이동/회전 변환 행렬을 구해보고 있는데요. 캘리브레이션을 해서 구한 초점거리가 맞는 것인지 증명할 방법이 없다는 생각이 듭니다. 왜냐하면 물체를 맨 앞에 있는 렌즈와 내가 알고 있는 거리만큼 간격을 두고 배치한다고 해도 내부의 제2주점 위치를 알 수 없기 때문에 제2주점과 물체 사이의 거리는 구할 수 없게 됩니다. 즉 '카메라 캘리브레이션'글에서 월드좌표계의 X,Y,Z를 알 수 없는 것이죠. 따라서 사진을 통해 이동/회전 변환 행렬을 구하고 X,Y,Z를 계산했어도 이를 실제 X,Y,Z 값과 비교할 수 없기 때문에 결과적으로 캘리브레이션을 통한 파라미터들이 옳게 구해졌는지 알 수 있는 방법이 없다는 생각이 들었습니다. 파라미터를 옳게 구했는지 알 수 있는 방법이나 제가 말씀드린 부분 중에 잘못된 부분이 있으면 알려주시면 감사하겠습니다. ^^

    • BlogIcon 다크pgmr 2017.03.22 20:39 신고 수정/삭제

      말씀하신 내용 모두 맞다고 생각되며 검증 방법은 저도 딱히 생각나는 바가 없습니다..

    • 학생하잿 2017.03.23 16:46 신고 수정/삭제

      그렇군요~ 답변 감사합니다 ^^
      블로그 글이나 다른 분들 댓글을 통해 많은 정보를 얻어 갑니다. 감사합니다!!

  • 미카이 2017.10.07 00:31 신고 ADDR 수정/삭제 답글

    안녕하세요 글 잘봤습니다!
    궁금한점이 pinhole 카메라 모델 (그림출처: 위키피디아) 여기 그림에서 아래그림과 비교해보면,
    아래그림에서는 핀홀 구멍이 렌즈로 봐도 무방한건가요? 꺽이는 지점이니, 그럼 핀홀 부분과 뒤 image plane부분이 focal length가 되는건가요? 이해를 제대로한지가 궁금하네요! 좋은 블로그 포스팅 감사드림니다!
    자답합니다.
    cali쪽 블로그 포스팅한글을 보면서 이해가 되었네요. 핀홀 즉, 렌즈부터 image plane 사이 거리가 focal length가 맞군요. 감사드림니다!

  • 궁금한학아이 2017.11.21 09:25 신고 ADDR 수정/삭제 답글

    안녕하세요, 카메라 관련 공부를 하다가 정리를 잘하신것같아 질문드립니다.
    혹시 카메라의 resolution은 카메라 sensor size / cell size로 구하는것 아닌지요?
    예를 들어 카메라의 sensor의 size가 4.8 mm x 3.6 mm이고, cell size가 7.4um라면, 이 카메라의 resolution은 (4800/7.4) x (3600/7.4)가 되는건가요??

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

      네, 저도 자세히는 모르지만 그렇게 생각하셔도 될 것 같습니다. 정확히는 셀의 개수가 최대 해상도로 생각됩니다.