Xiang Gao, Tao Zhang 저자의 'Introduction to Visual SLAM from Theory to Practice' 책을 통해 SLAM에 대해 공부한 내용을 기록하고자 한다.
책의 내용은 주로 'SLAM의 기초 이론', 'system architecture', 'mainstream module'을 다룬다.
포스팅에는 기초 이론만 다룰 것이며, 실습을 해보고 싶다면 다음 github를 참조하자.
https://github.com/gaoxiang12/slambook2
목차
이제까지 로봇의 6 DoF(Degree of Freedom) pose를 어떻게 표현하고 최적화하는지, 그리고 SLAM에서의 motion과 observation에 관련된 변수 및 수식 몇 가지의 의미를 알아보았다.
이번 포스팅에서는 (observation equation을 포함하여)로봇이 세계를 어떻게 관측하는가를 알아볼 것이다.
Camera-based SLAM에서 observation은 주로 image projection의 과정을 말한다.
연구 분야인 3D Vision의 기초를 다루는 내용이므로 아주 중요한 부분이다!
이번 포스팅은 주로 camera model, projection relationship, internal parameters, 간단한 stereo and RGB-D camera 내용을 다룬다.
Pinhole Camera Models
3D point (meter 단위)를 2D image plane(pixel 단위)으로 project하는 과정은 기하학적 모델(geometrical model)로 설명할 수 있다.
가장 간단한 모델인 Pinhole 모델을 먼저 알아볼 것이다.
여기에 렌즈(lens)가 추가된다면 projection 과정에서 왜곡(distortion)이 발생할 것이고, 이러한 모델을 distortion model이라 한다.
Pinhole Camera Geometry
한 번 정도는 pinhole model을 구경해본 적이 있을 것이다.
Pinhole model은 3차원 공간에서 한 점의 좌표와 핀홀 카메라의 이미지 평면에 대한 projection 사이의 수학적 관계를 나타내는 모델으로, 간단한 camera 센서의 imaging process를 설명하기 좋은 모델이다.
이 모델의 geometry를 알아보자.
- Camera coordinate system : \(O-x-y-z\) 축을 사용하여 표현된 공간이다.
- 축 : z축은 카메라의 앞 방향, x축은 카메라의 오른쪽, y축은 카메라의 아래쪽을 나타낸다.
- 중심점 \(O\) (Optical Center) : 핀홀 모델에서의 hole이며, 카메라의 중심을 나타낸다.
- 3D point \(P\)는 hole \(O\)를 지나 imaging plane \(O^\prime-x^\prime-y^\prime\)에 투영(project)된다. 이렇게 투영된 점을 \(P^\prime\)으로 표현할 것이다.
- \( \begin{bmatrix} X & Y & Z \end{bmatrix}^T \) : \(P\)의 좌표이다.
- \( \begin{bmatrix} X^\prime & Y^\prime & Z' \end{bmatrix}^T \) : \(P'\)의 좌표이다.
- Focal length (\(f\)) : imaging plane과 camera plane 사이의 거리를 나타낸다.
삼각형의 닮음에 따라, 다음 식이 성립한다.
\( \frac{Z}{f} = -\frac{X}{X'} = -\frac{Y}{Y'} \)
음수는 image가 뒤집혔음을 의미한다.
모델을 좀 더 실제같이 표현하기 위해, 다음과 같이 symmetric image plane을 정의하여 값을 모두 양수로 만들어줄 수 있다.
\( \frac{Z}{f} = \frac{X}{X'} \frac{Y}{Y'} \)
이렇게 symmetric image plane을 사용하는 것은 수식을 간단하게 해주기 위함이다. 대부분 이미지는 위아래가 뒤집혀있는데, 카메라 소프트웨어를 통해 우리가 보기 쉽게 이미지를 바꿔준다.
이제 \(X', Y'\)에 관한 식으로 식을 바꾸어준다.
\( X' = f \frac{X}{Z}, \quad Y' = f \frac{Y}{Z} \)
이를 통해 point \(P\)와 투영된 이미지 간의 공간적인 관계를 수식으로 표현할 수 있게 되었다.
또한 카메라 이미지는 최종적으로 픽셀로 표현된다. 따라서 미터 단위로 표현된 길이를 픽셀 단위로 sampling(quantizing)해주어야 한다.
센서가 인지한 빛을 이미지 픽셀로 어떻게 바꾸는지 설명하기 위해, imaging plane 상에 고정된 pixel plane \(o-u-v\)를 설정한다.
따라서, \(P'\)은 pixel plane에서 다음과 같이 픽셀 좌표로 표현될 수 있다.
\( P' = \begin{bmatrix} u & v \end{bmatrix}^T \)
픽셀 좌표계(pixel coordinate system)의 정의는 다음과 같다. (축의 명칭과 방향은 책마다, 표현하는 사람마다 조금씩 다를 수 있다. 그림에서의 c축은 u축, r축은 v축으로 생각하고, y축은 반대 방향이라고 생각하자.)
origin \(o'\)가 이미지의 upper left 끝에 존재하고, \(u\) axis는 x축, \(v\) axis는 y축에 평행하다.
픽셀 좌표계와 imaging plane 사이에는 zoom(scaling)과 origin의 translation의 관계가 존재한다. 즉, pixel 좌표를 설정할 때, \(u\) axis에는 \(\alpha\), \(v\) axis에는 \(\beta\)를 곱하여 scaling을 적용하며, origin은 \( \begin{bmatrix} c_x & c_y \end{bmatrix}^T \)만큼 평행이동시킨다.
이러한 관계를 수식으로 나타내면 다음과 같다.
\( \begin{cases} u = \alpha X' + c_x \\ v = \beta Y' + c_y \end{cases} \)
Point \(P\)와 투영된 이미지 간의 관계식에 위 식을 대입하게 되면 다음 식을 얻는다. (\(\alpha f\)를 \(f_x\), \(\beta f\)를 \(f_y\)로 설정하였다.)
\( \begin{cases} u = f_x \frac{X}{Z} + c_x \\ v = f_y \frac{Y}{Z} + c_y \end{cases} \)
\(f\)는 meter 단위를 갖는 focal length, \(\alpha, \beta\)는 pixel/meter 단위를 갖는 scaling factor이므로 \(f_x, f_y, c_x, c_y\) 값의 단위는 pixel이 된다.
위 식을 matrix 형태로 나타내면 더 compact하게 나타낼 수 있다.
\( \begin{pmatrix} u \\ v \\ 1 \end{pmatrix} = \frac{1}{Z} \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} \triangleq \frac{1}{Z} \mathbf{KP} \)
\( Z \begin{pmatrix} u \\ v \\ 1 \end{pmatrix} = \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} \triangleq \mathbf{KP} \)
이 수식에서, 가운데의 행렬을 카메라의 inner parameter matrix (or intrinsics) \(\mathbf{K}\)라 한다.
카메라의 intrinsic은 제조 이후에 변하지 않는다(fixed)는 특징을 갖고, 대부분 제조사에서 이 값을 제공한다. 또한, 이러한 internal parameters를 직접 추정하는 일을 calibration이라 한다.
internal parameter(intrinsic)가 있다면, external parameter(extrinsic)도 있을 것이라 유추해볼 수 있다. 위 식 중 첫 번째 식에서, camera coordinate system 내에서의 \(P\)라는 좌표를 이용했다. 하지만 사실 \(P\)라는 좌표는 카메라가 항상 움직이기 때문에 world coordinate일 것이다. (이러한 world 좌표에서의 \(P\)를 따로 \( \mathbf{P}_w \)라 표시할 것이다.) 이 좌표는 현재 카메라의 pose에 따라 camera coordinate system의 좌표로 변환되어야 한다.
Camera의 pose는 rotation matrix \( \mathbf{R}\)과 translation vector \( \mathbf{t}\)로 나타내므로, 다음 식이 성립한다.
\( Z \mathbf{P}_{uv} = Z \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \mathbf{K} ( \mathbf{R} \mathbf{P}_w + \mathbf{t}) = \mathbf{KT} \mathbf{P}_w \)
식을 통해 homogeneous 좌표계에서 non-homogeneous 좌표계로 변환된다.
\( \mathbf{TP} \)를 계산하는 과정은 homogeneous coordinate를 사용하지만, non-homogeneous coordinate로 바꾼 후에 \( \mathbf{K} \)와 곱하는 과정을 거치게 된다.
최종적으로 위 식은 점 \(P\)에 대한 world coordinate와 pixel coordinate간의 projection relationship을 보여준다.
그 중에서도 카메라의 pose를 나타내는 \( \mathbf{R, t}\)를 해당 카메라의 extrinsic이라 한다. Intrinsic과 비교해서, extinsic은 카메라의 설치 위치 등에 따라 사용 시 계속해서 변화할 수 있고, SLAM에서 추정의 대상이 된다.
위 식을 통해, world coordinate의 점을 camera coordinate system으로 변환한 후 마지막 차원을 없앨 수 있다는 점을 알 수 있다. 카메라의 imaging plane으로부터의 depth를 제거할 수 있다는 의미인데, 이는 곧 마지막 차원에 대한 normalization의 개념이다.
이 방법을 사용하여 normalized plane 상에 점 \(P\)를 projection할 수 있다.
\( (\mathbf{R} \mathbf{P}_w + \mathbf{t}) = \quad \begin{bmatrix} X & Y & Z \end{bmatrix}^T \quad \rightarrow \quad \begin{bmatrix} X/Z & Y/Z & 1 \end{bmatrix}^T \)
여기서 \( \begin{bmatrix} X & Y & Z \end{bmatrix}^T \)는 카메라 좌표계 상의 점이고, \( \begin{bmatrix} X/Z & Y/Z & 1 \end{bmatrix}^T \)는 normalized 좌표계 상의 점이다. 이를 통해, normalized plane은 곧 \(z = 1 \text{plane}\)임을 알 수 있다.
즉, 어떤 점 \(P\)를 normalize한 후 intrinsic matrix \(\mathbf{K}\)와 곱하면 픽셀 좌표계의 좌표를 얻을 수 있고, 이러한 픽셀 좌표 \( \begin{bmatrix} u & v \end{bmatrix}^T \)는 normalized plane 상의 점에 대한 정량적인 measurement임을 알 수 있다.
만약 카메라 좌표에 0이 아닌 factor를 곱하게 되면 normalized coordinate 값은 같게 된다. 즉, projection 과정에서 depth의 정보는 사라진다.
Distortion
보통 더 큰 FoV (Field-of-View)를 얻기 위해, 카메라에 렌즈를 장착한다. 하지만 이로 인해 imaging 과정에서 다음과 같은 영향을 받는다.
- 렌즈의 형태에 따라 빛이 전파되는 길이 바뀔 수 있다. (방사 왜곡, radial distortion)
- 볼록렌즈의 굴절률에 의해 발생한다.
- Mechanical assembly 과정에서 렌즈와 imaging plane은 완전히 평행하지 않기 때문에 투영되는 위치가 바뀌게 된다. (접선 왜곡, tangential distortion)
- 카메라 제조(조립) 과정에서 렌즈와 이미지 센서의 수평이 맞지 않거나, 렌즈 자체의 centering이 맞지 않아서 발생한다.
먼저, 렌즈의 형태에 따른 영향부터 알아보자.
렌즈를 사용하게 되면 실제 직선이 투영되어 곡선처럼 보이는 왜곡이 발생하며, 이런 현상은 이미지의 가장자리일수록 두드러진다.
이러한 왜곡은 크게 두 가지로 나뉜다.
- Barrel-like distortion
- Cushion-like distortion
Barrel distortion에서는 축(optical axis)의 거리가 증가함에 따라 픽셀의 반경이 줄어들고, cushion distortion은 그 반대이다.
두 distortion 모두 이미지의 가운데를 지나는 직선의 optical axis의 길이는 변하지 않는다.
다음으로, 렌즈의 형상 말고도 tangential distortion이 발생한다.
Tangential distortion이란, 아래 그림과 같이 카메라의 기계적인 assembly 과정에서 렌즈와 imaging surface가 완전히 평행하지 않은 경우에 왜곡이 발생하는 것을 말한다.
점의 좌표가 접하는 방향(tangential direction)에 따라 변화하는 것처럼 보이며, 이는 곧 horizontal angle이 변한다는 의미이다.
다음으로, 왜곡 현상을 수식으로 나타내보자.
먼저, (왜곡이 일어나지 않은) normalized plane 상의 점 \( \mathbf{p} \)는 \( \begin{bmatrix} x & y \end{bmatrix}^T \), 혹은 극좌표로 \( \begin{bmatrix} r & \theta \end{bmatrix}^T \)로 나타낼 수 있다.
여기서, \( r = x^2 + y^2\)이다.
Radial distortion 발생한 후의 점인 normalized coordinate \( \begin{bmatrix} x_{\text{distorted}} & y_{\text{distorted}} \end{bmatrix} \)에 대해, 다음과 같은 다항식이 성립한다.
\( \begin{bmatrix} x_{\text{distorted}} \\ y_{\text{distorted}} \end{bmatrix} = (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) \begin{bmatrix} x \\ y \end{bmatrix} \)
또한, tangential distortion 후에는 \(p_1, p_2\) 파라미터를 사용하여 다음과 같이 나타낸다.
\( \begin{bmatrix} x_{\text{distorted}} \\ y_{\text{distorted}} \end{bmatrix} = \begin{bmatrix} x + 2p_1 x y + p_2(r^2 + 2x^2) \\ y + p_1 (r^2 + 2 y^2) + 2 p_2 x y \end{bmatrix} \)
두 가지 왜곡을 함께 고려하면 총 5개의 distortion coefficients(\( k_1, k_2, k_3, p_1, p_2 \))를 통해 수식으로 나타낼 수 있다.
\( \begin{cases} x_{\text{distorted}} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2 p_1 x y + p_2 (r^2 + 2x^2) \\ y_{\text{distorted}} = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1 (r^2 + 2 y^2) + 2 p_2 x y \end{cases} \)
실제 수식을 통해 왜곡을 보정하는 과정에서는 파라미터 개수를 상황에 맞게 선택하는 경우가 대부분이다. 예를 들어, \(k_1, p_1, p_2\)만 사용하는 경우도 있고, \(k_1, k_2, p_1, p_2\)만 사용하는 경우도 있을 수 있다.
Affine model이나 perspective model 등 다른 모델을 사용하여 이미지 프로세싱을 하는 연구도 많이 진행되었고, 이에 따라 왜곡을 정의하는 방법도 아주 다양하다. 하지만, visual SLAM 분야에서는 위에서 제시한 'pinhole and rad-tan distortion model'로 충분하다.
다음으로, 왜곡을 보정(undistortion, correction)하는 방법은 두 가지 방법이 존재한다.
- 전체 이미지를 먼저 undistort하여 corrected image를 얻은 후에 이미지에 대한 점의 공간적 위치를 논한다.
- Distorted image에서 feature points를 몇 개 추출하여 distortion equation을 통해 실제 위치를 찾는다.
두 방법 다 실현 가능한데, 첫 번째 방법이 visual SLAM에서 더 일반적이다.
마지막으로 monocular camera의 이미지 프로세싱 과정을 요약해보자.
- World coordinate system에서의 좌표값(world coordinate)이 \( \mathbf{P}_w \)인 점 \(P\)가 존재한다.
- 카메라는 움직이기 때문에, 카메라의 motion은 \( \mathbf{R}, \mathbf{t} \) 또는 transform matrix \( \mathbf{T} \in \text{SE}(3) \)로 나타낼 수 있다. 이에 따라 점 \(P\)에 대한 카메라의 좌표는 \( \tilde{\mathbf{P}}_c = \mathbf{R} \mathbf{P}_w + \mathbf{t} \)이다.
- \( \tilde{\mathbf{P}}_c \)의 성분은 \(X, Y, Z\)이며, normalized plane \(Z=1\) 위에 투영(project)되어 normalize coordinate \( \mathbf{P}_c = \begin{bmatrix} X/Z & Y/Z & 1 \end{bmatrix}^T \)를 갖게 된다.
- 이때 Z는 1보다 작을 것임에 유의하자. 점은 normalized plane 뒤에 존재하며, camera plane에 투영되어서는 안되기 때문이다.
- 이미지가 왜곡되었다면, 왜곡 후의 \( \mathbf{P}_c \) 좌표는 distortion parameters에 따른 distortion equation으로 구할 수 있다.
- Intrinsic을 거쳐 식 \(\mathbf{P}_{uv} = \mathbf{K} \mathbf{P}_c\)를 통해 pixel coordinate를 구할 수 있다.
언급한 좌표는 world coordinates, camera coordinates, normalized coordinates, pixel coordinates로 총 4개이다.
이미지 프로세싱 전반적인 과정과 추후에 배울 개념에 각각의 개념과 서로의 관계가 매우 중요하므로, 잘 알아두도록 하자.
Stereo Cameras and RGB-D Cameras
Pinhole camera model을 통해 하나의 카메라에서 얻은 이미지를 처리하는 과정을 이해해보았다.
하지만, 아래 그림에서 볼 수 있듯이 normalized plane에 scaling을 얼마나 해주는가에 따라 점 \(P\)의 depth가 될 수 있는 값이 무수히 많으므로, 하나의 이미지로는 구할 수 없다.
점 \(P\)의 depth, 즉 정확한 공간적 위치를 구하기 위해서는 binocular(2개) 카메라 혹은 RGB-D 카메라가 필요하다.
Stereo Cameras
Pixel distance(=depth)를 구할 수 있는 방법은 여러가지가 있다.
그 중에서 binocular camera(stereo camera)는 사람의 두 눈과 같은 방식을 사용하여 왼쪽 카메라의 이미지와 오른쪽 카메라의 이미지를 동시에 얻어 이미지 사이의 parallax(disparity)를 계산함으로써 depth값을 얻는다. (보통 사람과 같이 좌, 우 방향으로 카메라를 정렬함)
두 카메라는 각각 pinhole camera로 모델링할 수 있으며, x축이 같다.
또한, 두 카메라의 center간 거리를 baseline(\(b\))이라 한다. 중요한 parameter이니 꼭 기억해두자.
위 모델은 다음과 같이 설명할 수 있다.
- \(O_L, O_R\) : left, right optical center
- \(f\) : focal length
- \(u_L, u_R\) : 같은 point \(P\)에 대한 pixel coordinates (x축 좌표)
- 이때, \(u_R\)은 위 그림에서 음수임에 유의하자. 물리적인 거리도 \(-u_R \)로 표현해야 한다.
이제 3차원 공간 상의 점 \(P\)를 생각해보자. 이 점은 왼쪽, 오른쪽 카메라에 대한 image plane 상에 각각 \( P_L, P_R \)로 투영되었다.
이상적으로 왼쪽, 오른쪽 카메라는 x축 위치만 다르다고 할 경우, \(P\)의 이미지 또한 \(x\)축, 즉 pixel plane 상에서의 \(u\)축 값만 다를 것이다.
\(P_L\)의 pixel coordinate를 \(u_L\), \(P_R\)의 pixel coordinate를 \(u_R\)이라 하면, 위 그림의 오른쪽과 같은 geometric relationship을 가질 것이다.
\(\triangle P P_L P_R\)과 \( \triangle P O_L O_R\)의 닮음에 따라 다음 수식이 성립한다. (\(u_R\)의 부호 주의!)
\( \cfrac{z - f}{z} = \cfrac{b - u_L + u_R}{b} \)
여기서 \(u_L\) 좌표와 \(u_R\) 좌표의 차이를 disparity(or parallax, \( d = u_L - u_R\))라 한다.
이를 통해 다음과 같이 정리할 수 있다.
\( z = \cfrac{fb}{d} \)
Parallex를 통해 픽셀과 카메라 사이의 거리(distance)를 추정할 수 있다. Parallax는 distance에 반비례한다. (위 그림에서 Image Plane이 멀어질수록, 즉 거리가 멀어질수록 Parallex는 줄어들 것임을 쉽게 알 수 있다.)
또한 parallax는 최소 1 pixel (d의 최솟값이 1)일 것이므로, binocular depth \(z\)의 최댓값은 \(fb\)로 정해진다. 더 먼 거리를 보기 위해서는 더 큰 stereo camera가 필요하다. 예를 들어, 사람은 하늘 높이 떠있는 비행기를 볼 때 얼마나 높이 있는지 정확하게 인지할 수 없다.
Depth를 구하는 수식은 매우 간단하지만, parallax \(d\)를 구하는 과정이 복잡하다. 왼쪽 이미지의 점(픽셀)이 오른쪽 이미지에서 어디에 있는지(corresponding relationship) 정확하게 알아야 하기 때문이다.
Binocular depth estimation의 경우 image texture에 따라 정확성이 좌우되고, 계산량이 많아 실시간 계산을 위해 GPU나 FPGA가 필요한 경우가 생긴다.
RGB-D Cameras
Binocular 카메라는 계산을 통해 depth를 구하지만, RGB-D 카메라는 센서로 직접 depth를 측정한다.
Depth를 직접적으로 측정하기 위해서는 결국 target object로 빛을 쏴야 한다. 주요 원리에 따라 RGB-D 카메라(센서)는 크게 두 가지 카테고리로 나뉜다.
- Pixel distance를 측정하기 위해 structured infrared light(적외선)을 사용한다.
- Structured light을 object에 쏘고, 되돌아오는 structed light의 패턴을 기반으로 distance를 계산한다.
- ToF(Time-of-Flight)를 사용하여 측정한다.
- Light pulse를 방출하고, 그 광선의 도착 시간에 따라 distance를 계산한다.
- ToF 카메라는 전체 이미지 픽셀에 대한 depth를 얻을 수 있는데, 이것은 또한 RGB-D 카메라의 단점이기도 하다.
- 일반적인 카메라에 추가로 최소 하나 이상의 transmitter와 receiver가 필요하다.
Depth를 측정한 이후, RGB-D 카메라는 depth와 color map 간의 페어링(pairing)을 한다.
이를 통해 color 정보와 distance 정보를 같이 얻을 수 있으며, 픽셀들의 3D 카메라 좌표를 계산할 수 있고, point cloud를 생성할 수도 있다. (point cloud 생성은 한계점이 많다.)
RGB-D 카메라는 각 픽셀의 distance를 실시간으로 측정할 수 있다. 하지만 이를 위해서는 transmitting과 receiving 과정이 필요하므로 사용 환경이 제한적이다. 적외선을 사용할 경우 햇빛이나 다른 센서의 적외선의 간섭이 생길 수 있으므로 실내에서만 사용 가능하고, 투명한 물체와 검정색 물체 등 빛을 반사하지 않을 경우 거리를 잴 수 없다.
이외에도 가격과 전력 소비 면에서의 단점이 존재한다.
Representation of Images
카메라와 렌즈는 3차원 세계의 정보(Scene)를 pixel로 구성된 2차원 사진으로 바꿔주어 컴퓨터에 저장 및 처리된다.
수학적으로 이미지는 matrix로(컴퓨터에서 2차원 배열로) 표현된다.
이제 컴퓨터에서 이미지 프로세싱을 진행할 때 기초적인 operation을 알아보자.
먼저 가장 간단한 경우인 grayscale image이다. Grayscale 이미지에서 각 pixel 위치 \((x, y)\)는 특정 값 \(I\)에 대응된다.
따라서, 너비(width)가 \(w\)이고, 높이(height)가 \(h\)인 이미지는 수학적으로 다음과 같은 함수로 나타낼 수 있다.
\( (I)(x,y) : \mathbb{R}^2 \mapsto \mathbb{R} \)
이는 2차원 (matrix)가 1차원 실수로 맵핑된다는 것을 나타내며, 간단하게 특정 pixel 위치에 어떤 실수 값이 존재한다는 의미이다.
컴퓨터는 실수를 표현할 수 없으므로, \(x\)와 \(y\)는 \((0 ~ w-1)\), \(( 0 ~ h-1)\) 범위의 정수로, 이미지를 읽기 위한 실수 값은 \((0 ~ 255)\) 범위의 정수(C++에서의 unsigned char, 1byte)로 표현된다.
그리고, (width, height) = (640, 480) 크기의 grayscale image는 프로그래밍 상에서 2D array를 사용하여 다음과 같이 표현한다.
unsigned char image[480][640];
이러한 표현은 C++문법을 따랐으며, 프로그래밍 상에서는 width가 열의 개수, height가 행의 개수이므로 순서에 주의해야 한다. (이미지 프로세싱 과정에서 오류가 발생하는 경우, 위 순서가 반대로 된 경우가 매우 많다고 한다.)
일반적으로 pixel 좌표계(pixel coordinate system)는 위 사진과 같이 이루어진다. 왼쪽 위에 origin이 존재하고, x축이 오른쪽, y축이 아래쪽을 향한다. (Z축은 오른손 법칙에 따라 화면에 들어가는 방향이 될 것이다.) 이러한 축의 정의는 카메라 좌표계(camera coordinate system)와 같다.
그리고, 다음과 같은 코드로 특정 픽셀에 접근할 수 있다.
unsigned char pixel = image[y][x];
이는 곧 위에서 수학적으로 정의한 gray value \(I(x,y)\)를 읽는 것과 같다. 역시 행과 열의 순서에 주의하자.
Grayscale에서 더 나아가 색상을 표현하고 싶다면 RGB의 3개 채널을 사용하게 된다. 이때는 grayscale 이미지 3개가 각각 Red, Green, Blue 색상을 표현한다고 이해하면 쉬울 것이다. 따라서 1픽셀이 24bit 공간을 차지하게 된다.
Depth(distance)의 경우 밀리미터 단위로 측정된다. 이를 표현하기 위해서는 256개의 숫자는 너무 적다. 따라서 depth map을 표현할 때에는 16-bit inteager(C++에서의 unsigned short), 즉 0~65535까지의 숫자를 사용한다. 미터로 따지자면 65.5미터 정도까지의 distance를 표현할 수 있게 된다. (RGB-D 카메라를 사용할 때 이 정도의 거리를 표현할 수 있으면 충분하다.)
최근댓글