Camera Model
Introduction
- 자율주행에서 Perception은 주행 환경을 인지(인식+이해)하는 과정으로, 유의미한 정보를 생성하는 단계가 필요하다.
- Vision의 경우, 이미지 영역에서 객체를 인식하는 것이 아닌 객체와 차량의 관계를 파악하는 것이 중요하다.
- 3D POSE Estimation의 기본적인 Vision 기반 기술을 소개한다.
- Vision Geometry의 기본적인 지식을 학습한다.
Camera Model
- 카메라는 3차원 공간인 세상(World) 존재하는 대상(Object)를 2차원 공간인 이미지 평면(Image Plane)에 투영(Projection)하는 센서이다.
- 카메라 모델은 카메라의 투영 과정을 수학적 모델로 표현한 것이다.
- 사람은 매우 뛰어난 카메라 2개와 컴퓨터 1대를 가지고 있다. -> Computer Vision의 꽃 Camera Geometry에 대한 이야기.
- 따라서 직관적으로, 이미지로 다양한 추론이 가능하다.
- 소실점: vanishing point
- 소실선: vanishing line
- 어떤 3차원 공간에 사과가 있다고 하자.
- 사람의 눈에 사과가 보이는 것은 사과로부터 반사된 빛이 눈으로 들어오기 때문이다.
- 카메라는 3차원 공간에 존재하는 물체에 반사된 빛을 기록하는 장치이다.
- 미세한 위치에 무한에 가까운 난반사 빛을 카메라에 입력하면 어떻게 될까 ?
- 아마도 사과가 아닌 이상한 이미지가 만들어질 것이다.
Camera Model - Pinhole Camera Model
- 하지만 우리는 사과를 찍으면 정확히 사과 그림이 출력된다.
- 왜 그런 것일까?
- 그래서 동일한 크기의 물체여도
- 가까이서 촬영하면 크게 보이고,
- 멀리서 촬영하면 작게 보인다.
- 반사된 빛과 Pinhole의 관계가 달라지기 때문
- Pinhole Camera의 Geometry & Formular는 아래 그림과 같이 표현한다.
- Pinhole Camera Model과 Projection Matrix를 이해하는 것이 핵심이다.
- Intrinsic: 카메라 자체의 특성
- extrinsic: 카메라와 대상과의 관계
- r: rotation (회전)
- t: translation (평행이동)
- 기준좌표계를 알 수 있다면 기준좌표계로부터의 어떠한 u,v 좌표만을 가지고 X,Y,Z의 좌표를 알 수 있지 않을까? (⎣⎢⎡fx000fy0cxcy1⎦⎥⎤, ⎣⎢⎡r11r21r31r12r22r32r13r23r33t1t2t3⎦⎥⎤은 이미 알고 있는 값)
Camera Model - Another Camera Model
- 카메라 종류에 따라 다양한 Camera Model이 존재한다.
Camera Model에 따라 이미지의 형태가 달라진다.
- Fisheye Camera Model: 360도 초광각
- 특수한 렌즈를 사용하기 때문에 카메라에 대한 모델 자체가 달라진다.
- Weak Perspective Model: 3차원 공간에 존재하는 Object로 부터 이미지가 직선으로 들어왔다고 하면, Weak Perspective Model은 depth plane이라고 하는 가상의 공간을 만들어서 그 공간까지 그대로 평행이동을 시킨 후 빛이 들어오는 구조를 가진다. 카메라 이미지 센서의 종류 등에 따라 모델이 달라진다.
Camera Intrinsic Calibration
Calibration
- Camera Calibration은 카메라가 가지고 있는 고유한 특성을 파악하는 과정이다.
- 카메라는 Camera Project Matrix에 의해 두 가지 종류의 고유한 특성을 가진다.
- Intrinsic(내부): 카메라의 내부적인 특성(렌즈와 이미지 센서와의 관계로부터 파생되는 초점거리 등...)
- Extrinsic(외부): 카메라가 대상을 촬영했을 당시의 위치와 자세에 관한 특성
- 그렇다면 왜 카메라는 Intrinsic/Extrinsic 두 가지 특성으로 구분할까?
- Intrinsic: 동일한 위치에서 서로 다른 카메라로 동일한 피사체를 촬영하면, 그 결과가 다르다.
- (참고) 초점 거리(f)가 클수록 피사체를 크게 촬영할 수 있다.
- Extrinsic: 같은 카메라로 서로 다른 위치에서 동일한 피사체를 촬영하면, 그 결과가 다르다.
- (참고) 거리가 가까울수록 피사체를 크게 촬영할 수 있다.
- Intrinsic, Extrinsic 모두에 대해 Calibration을 진행해야 한다.
Intrinsic
- Intrinsic Calibration은 초점거리(fx,fy)와 주점(cy,cx)을 의미한다.
- 그렇다면 초점거리(focal length)와 주점(principal point => center point)은 무엇일까? 먼저 초점거리를 살펴보자.
- 카메라에서 Pinhole은 렌즈를, 벽은 이미지 센서를 의미한다.
- 초점거리에 대한 자세한 설명: https://darkpgmr.tistory.com/107
- 초점거리는 렌즈의 중심과 이미지센서의 거리이다.
- 초점거리에 따라 피사체를 축소/확대한 것과 같이 촬영할 수 있다.
- 실제 이미지는 2차원 평면이기 때문에, 아래 그림에 나타난 초점거리는 한 축에 대한 초점거리를 의미한다.
- Computer Vision에서 초점거리는 Pixel 단위로 표현한다. (디지털 카메라에서 사용하는 초점거리와 단위가 다르다.)
- 카메라(또는 광학)에서는 초점거리를 실제 물리 단위인 mm로 표현한다.
- 이미지 센서(CCD or CMOS)와 렌즈 중심과의 거리
- 하지만 Computer Vision에서는 이미지 센서의 Cell 크기에 대한 상대적인 Pixel 단위로 표현한다.
- 만약 이미지 센서 Cell크기가 0.1mm이고 초점거리 f = 500(pixel)이라면
- 이미지 센서와 렌즈 중심과의 거리는 Cell 크기의 500(pixel)배 -> 50mm를 의미한다.
- 이는 이미지 해상도에 따라 초점거리가 달라지는 이유이기도 하다.
- 이미지 Cell 크기에 대한 상대적인 단위이기 때문
- 예를 들어,
- 100x100 Cell Size(0.1mm)
- 100x100 Image해상도(Resolution)
-> 1x1 Cell이 하나의 Pixel을 표현한다.
-> 따라서 0.1mm * Focal Length(Pixel) = Focal Length(mm)
- 100x100 Cell Size (0.1mm)
- 50x50 Image 해상도
->2x2 Cell이 하나의 Pixel을 표현한다.
-> 따라서 0.2mm * Focal Length(Pixel) = Focal Length(mm)
-> 물리적인 초점 거리는 동일하기 때문에 Pixel 단위의 초점거리는 절반으로 줄어든다.
- 초점거리와 더불어 Intrinsic Calibration은 주점(principal Point, cy,cx)이 존재한다.
- 주점은 Pinhole이 이미지 센서에 직교하는 위치를 의미한다.
- 이상적인 경우 cx=width/2,cy=height/2
- 주점(Principal Point)과 이미지 중심점(Center Point)와 헷갈리는 경우가 많지만, 이는 다른 의미이다.
- 주점(=렌즈 중심점)이 이미지 중심점과 일치하는 경우가 이상적이지만, 카메라 제조 공정에서 발생하는 다양한 이슈로 일치하지 않는 경우가 있다.
- 주점을 정확하게 파악하기 위해서는 Calibration이 필요하다.
- 따라서 카메라의 Intrinsic Paramter를 정리하면 다음과 같다.
- ⎣⎢⎡fx00skew_cfxfy0cxcy1⎦⎥⎤: 이미지 단위가 전부 픽셀 단위
- skew_cfx는 Image의 비대칭 계수(skew coefficient)를 의미한다.
비대칭 계수는 이미지 센서의 Cell Array의 y축이 기울어진 정도를 의미한다. -> 0 (요즘은 발생하는 경우가 극히 드물다. 따라서 해석의 편의를 위해 0으로 지정해서 사용하기도 한다.)
- fx,fy(focal length) 초점: 렌즈와 이미지 센서의 거리, 단위는pixel
- cx,cy(principal point) 주점: 렌즈의 중심점과 그 중심점으로 선을 이어서 이미지 센서에 수직하게 내려앉은 부분의 좌표.
- 이상적인 경우엔 cx=width/2, cy=height/2
- cx,cy는 이미지 해상도에 위치점을 나타내기에 픽셀 단위이고, fx,fy(초점거리) mm인 물리 단위로 나타낼 순 있겠지만 그렇게 되면 서로 연산 단위가 달라지므로 변환을 해줘서 사용을 한다라고 이해하는것이 제일 깔끔하다.
Camera Intrinsic Calibration2
Coordinate
- Intrinsic Calibration은 왜 필요한 것일까? 카메라 투영 과정을 알아보자.
- 3차원 공간에 존재하는 한 물체가 2차원 이미지 공간에 투영되는 과정을 설명하려면 좌표계가 정의되어야 한다.
Computer Vision에서는 4개의 좌표계를 사용한다.
- 월드 좌표계(World Coordinate) -> Xw,Yw,Zw
- 카메라 좌표계(Camera Coordinate) -> Xc,Yc,Zc
- 이미지 좌표계(Image Coordinate) -> u,v
- 정규 이미지 좌표계(Normalized Image Coordinate) -> un,vn
World Coordinate
- 월드 좌표계는 우리가 살고 있는 3차원 공간에 존재하는 좌표계이다.
- 따라서 임의의 한 점을 기준으로 좌표계를 설정할 수 있다.
- 월드 좌표계를 기준으로 어떤 물체의 위치를 표현할 수 있다. -> Pw=(Xwo,Ywo,Zwo)
- 컴퓨터 비전에서는 보통 카메라 좌표계를 원점으로 표현함.
- 월드 좌표계를 기준으로 카메라의 위치를 표현할 수 있다.
Camera Coordinate
- 카메라 좌표계는 카메라를 기준으로 표현하는 좌표계이다.
- 카메라 기준으로 (일반적으로) 설정하는 좌표계는 다음과 같다.
- 카메라 렌즈가 바라보는 방향 -> Zc (종방향)
- 카메라 아래쪽 방향 -> Xc (지면을 향함)
- 카메라 오른쪽 방향 -> Yc
- 카메라 좌표계는 표현하는 방법이 조금 다르다. 따라서 참고하려는 라이브러리나 패키지에서 정의하고있는 좌표계를 확인하는것이 가장 중요하다. 실제로 사용할때에는 좌표계를 어느 한 기준으로 맞추어 주는것이 중요하다.
- Zc−>Xw: Zc를 월드좌표계상으로 표현할때 Xw로 변환해 주는것이 카메라 좌표계를 월드 좌표계로 변환을 해준다 라고 생각을 하면 된다.
- Xc−>Zw
Image Coordinate
- 이미지 좌표계는 실제 이미지로 표출되는 데이터를 표현하는 좌표계이다.
- 이미지 좌표계의 일반적인 기준은 다음과 같다.
- 이미지의 왼쪽 상단을 원점으로 한다.
- 이미지의 오른쪽 방향(Column)을 x또는 u로 표현한다.
- 이미지의 아래쪽 방향(Row)을 y 또는 v로 표현한다.
Normalized Image Coordinate
- 정규 이미지 좌표계는 실제로 존재하지 않는 좌표계로, Computer Vision에서 해석을 위해 정의한 가상의 좌표계이다.
- 렌즈로부터 이미지 평면까지의 거리를 초점거리(Focal Length)라고 정의하였다.
- 같은 물체를 동일한 위치에서 서로 다른 카메라로 촬영할 경우, 이미지에서 다르게 표현된다.
- 즉 카메라마다 초점거리가 다르기 때문에 이미지 좌표계에서 다른 위치에 존재한다.
- 따라서 초점거리를 1로 정규화 한 가상의 이미지 좌표계를 사용한다.
- 초점 거리에 대한 영향을 제거한다.
- 정규 이미지 좌표계와 이미지 좌표계의 차이
- 이미지 좌표계 -> 카메라 원점으로부터 초점거리만큼 떨어져 있는 이미지 평면
- 정규 이미지 좌표계 -> 카메라 원점으로부터 1만큼 떨어져 있는 가상의 이미지 평면
- 정규 이미지 좌표계와 이미지 좌표계의 변환 관계
- 카메라의 Intrinsic Calibration 정보를 알면, 이미지 좌표계 -> 정규 이미지 좌표계로 변환이 가능하다. (그 반대도 가능하다. -> 정규 이미지 좌표계의 위대한 능력)
- ⎣⎢⎡xy1⎦⎥⎤ = ⎣⎢⎡fx000fy0cxcy1⎦⎥⎤ ⎣⎢⎡uv1⎦⎥⎤
- ⎣⎢⎡uv1⎦⎥⎤ = 정규이미지
- ⎣⎢⎡xy1⎦⎥⎤ = 일반이미지
- 행렬 곱셈을 수행하여 풀어보면
- x=fxu+cx, u=fx(x−cx)
- y=fyv+cy, v=fy(y−cy)
- 찍은 이미지를 갖고 이미지를 찍은 카메라에 대한 Calibration 정보를 이용해서 u,v를 계산할 수 있고 얻어낸 u,v를 가지고 또 다른 카메라의 Intrinsic 정보를 이용해서 이미지 평면으로 옮기는것 또한 가능하다. 하지만 그렇게 되면 이미지가 군데군데 비어있는 경우가 있을 수 있다.
- A, B 카메라의 Intrinsic Calibration이 다르므로 Img결과값이 조금 다를 것
- 이미지는 A라는 카메라로 찍은 Intrinsic Calibration 정보에 의해서 얻어낸 이미지 결과인데 A라는 카메라의 특성에 따라 의존적이게 된다. 하지만 A라는 카메라의 특성에 따라 이미지가 의존적이게 된다. 하지만 A라는 카메라의 특성에 의존적이지 않게 동일한 관계에서 서로 다른 카메라로 찍었을때 같은 해석을 하기 위해서 정규 이미지 좌표계를 만든다.
Distortion
Distortion
- 왜곡이란 무엇이고 왜 발생할까?
- 실제 카메라는 Pinhole Camera Model에서 작은 구멍이 아닌, 렌즈로 빛을 모은다.
작은 구멍(Pinhole) -> 렌즈
이미지가 맺히는 벽 -> 이미지 센서
- 완벽한 Pinhole 카메라는 빛이 하나의 점을 통과하지만, 렌즈는 크기를 가지는 물체이기 때문에 빛이 굴절된다.
- 빛의 굴절은 이미지 센서에 보이는 이미지를 왜곡한다.
- 왜곡은 렌즈 형상이 곡률을 가지는 구면 형태이기 때문에 발생한다.
따라서 이미지 중심부(정확히는 주점, Principal Point)에서 멀어질수록 표현의 비율이 달라지기 때문에 발생한다.
- 왜곡(방사 왜곡)은 대표적으로 두 가지 형태로 표현된다.
- Barrel Distortion: 중심부가 외각부보다 큰 형태로 발생
- Pincushion Distortion: 중심부가 외각부보다 작은 형태로 발생
- 오목한 형태
- 방사 왜곡은 이미지의 중심으로부터 멀어질수록 왜곡의 정도가 심해진다.
- 또 다른 왜곡으로 접선 왜곡(Tangential Distortion)이 있다.
- 접선 왜곡은 카메라 제조 공정에서 발생하는 왜곡으로, 렌즈와 이미지 센서와의 수평이 맞지 않은 경우 발생한다.
- 접선 왜곡은 타원 형태로 발생하는 왜곡으로 방사 왜곡과는 다르게 표현된다.
- 방사/접선 왜곡 외에도 다양한 형태의 왜곡이 존재한다.
- 대표적인 예가 원근 왜곡(Perspective Distortion)이 있다.
- 방사 왜곡과 접선 왜곡이 광학의 원리와 카메라에서 발생하는 왜곡이라면, 원근 왜곡은 3차원 공간이 2차원 공간으로 투영되면서 발생하는 왜곡이다.
- 이미지는 공간의 깊이 정보가 하나의 평면으로 투영되는 데이터이기 때문에, 이미지를 촬영하는 환경에 따라 다양한 왜곡이(만들어질 수도, 만들 수도)있다.
- 앞 장에서 살펴본 카메라 투영의 기하학적 정의를 다시 보면
- 3차원 공간에 존재하는 Pw는 Projection Line(파란색 점선)에 따라 2차원 이미지에 점(빨간색 원)으로 투영되기 때문에 같은 라인에 존재하는 무수한 많은 점들(주황색 점)이 모두 동일한 위치에 표현된다.
- 따라서 부가적인 정보, 조건 없이 이미지에서 출력된 정보만으로 3차원 공간 정보로 복원하는건 불가능하다.
- (참고)
- 이런 문제를 해결하기 위해
- 다수의 카메라를 사용하는 방법
- 2개 이상의 카메라로 동일한 시점에 촬영한 각 1장의 이미지 만으로 3차원 위치 정보를 추정할 수 있다.
- 각 카메라의 Extrinsic Parameter를 알아야 정확한 정보를 추정할 수 있다.
- 2장 이상의 이미지를 사용하는 방법
- 같은 카메라로, 카메라가 움직이는 환경에서 연속된 이미지 정보를 활용하여 3차원 위치 정보를 추정할 수 있다.
- 카메라의 움직임 정보를 정밀하게 측정 & 추정해야 정확한 정보를 얻을 수 있다.
- 다양한 방법을 활용할 수 있다. -> Multiple View Geometry를 공부해야 하는 이유
- Computer Vision에서 왜곡은
이미지의 기하학적 정보를 정보를 해석하는데 방해하는 요소이기 때문에 이미지에서 왜곡을 보정하여 사용한다.
- 왜곡 모델을 카메라 투영 모델에 적용하기 위해 수식을 정리해보자
- s⎣⎢⎡xy1⎦⎥⎤ = ⎣⎢⎡fx00skew_cfxfy0cxcy1⎦⎥⎤ ⎣⎢⎡r11r21r31r12r22r32r13r23r33t1t2t3⎦⎥⎤ ⎣⎢⎢⎢⎡XwoYwoZwo1⎦⎥⎥⎥⎤
- 카메라 좌표계를 기준으로, 3차원 공간상에 존재하는 객체를 투영하는 모델을 계산하자.
Extrinsic Calibration은 왜곡 모델에 불필요하니 (Extrinsic 영향이 없다고 가정하면 행렬은 Identity Matrix가 된다.)
- s⎣⎢⎡xy1⎦⎥⎤ = ⎣⎢⎡fx00skew_cfxfy0cxcy1⎦⎥⎤ ⎣⎢⎡r11r21r31r12r22r32r13r23r33t1t2t3⎦⎥⎤ ⎣⎢⎢⎢⎡XwoYwoZwo1⎦⎥⎥⎥⎤
- s⎣⎢⎡uv1⎦⎥⎤ = ⎣⎢⎢⎢⎡XcYcZc1⎦⎥⎥⎥⎤이 된다. 이를 정리하면
- [un(undistort)vn(undistort)] = [Xc/ZcYc/Zc]
- undistort에 Distortion 모델을 적용하면
- 여기서,
- Normalized Image Plane을 Image Plane으로 변환하면
- 왜곡이 없는 이미지에서, 왜곡이 있는 이미지로 변환하는 과정
- 우리가 궁금한 것은 왜곡이 있는 이미지에서 왜곡이 없는 이미지로 만드는것이 궁금함.
왜곡된 이미지->왜곡이 제거된 이미지
- 반대로 왜곡된 이미지로부터 왜곡이 제거된 이미지를 계산해보자.
앞서 계산한 Image Plane에 투영한 Normalized Plane의 계산 식을 역으로 계산하면 된다.
- undistort도 내부적으로는 initUndistortRectifyMap을 계산하고 remap함수를 적용해준다.
- undistort를 적용했을때와, initUndistortRectifyMap을 계산하고 remap함수를 적용했을때의 시간을 비교해보자.