- 여러 이미지로부터 **3D 구조(geometry)**와 **카메라의 움직임(poses)**을 추정하는 기술 - 하나의 카메라로 움직이면서 여러 장의 이미지를 촬영한 경우, intrinsic은 고정되고 extrinsic만 변화한다고 가정
Orthographic Projection (From 3D to 2D)
- 물체를 카메라 축에 수직으로 투영하는 모델 => Scene이 카메라에 대해서 멀리 떨어져 있을때 => Scene이 가지고 있는 제일 가까운 곳과 먼쪽과의 차이가 카메라가 떨어진 distance에 비해 작으면 ==> Orthographic camera로 가정할 수 있다!
- 3D 점 Xc를 Image plane 상의 2D 좌표 (u,v)로 변환
Orthographic SFM
- frame f에서 point p의 2D 좌표가 주어진다.
- u,v는 주어져 있고, 이를 기반으로 P (3D point)를 구하고자 한다.
- (카메라마다) f마다 c가 존재한다. f마다 i와 j가 다르다.
=> Cf는 구하지 않아도 된다. (이로부터 i, j를 구할 수 있다.)
Centering Trick
Q) C를 어떻게 없애지? A) point의 평균에다가 중심을 두자!
이미지마다 평균점에다가 원점을 위치시킨다.3D 평균을 원점을 둔 경우카메라 원점을 이미지 중심으로 옮긴다.
=> 다음과 같이 진행하면 Cf가 사라진다. (centering만 바꿔주면 구해야 하는 Unknown 중 각 카메라의 center를 구할 필요가 없다.)
Observation Matrix W
Q) W로부터 M과 S를 어떻게 나누지? A) Matrix의 크기를 이용한다. (W가 가지고 있는 rank가 3 또는 그 이하이어야 한다.)
# Linear Independence of Vetors
어떻게든 만들어지지 않는다 => linear independent
# Rank of Matrix
위의 성질들을 보고서 다시 Observation Matrix W로 돌아가보자
Rank의 성질에 따르면 W에 대해서 다음이 성립한다.
이제 이것을 가지고 SVD를 진행한다.
σ는 제일 큰 값부터 차례대로 정렬한다. (σ1이 가장 크다)
=> Rank(W) 와 Rank(Σ)가 모두 3보다 작거나 같으므로 U2와 V2는 W를 구성하는데 영향을 주지 못한다.
Factorization (Finding M, S)
Q) σ1,2,3에 루트 씌워서 2개로 나누면 각각 M과 S일까? A) 맞긴한데 답은 하나이지만 4개의 solution이 나온다. => Q를 찾자!
Orthonormality of M
- Q를 구하기 위한 constraint를 구해보자 (Q : 3x3)
- Q : 3x3 matrix / 9 variable알아야 한다. - frame 3장 이상이면 Q를 구할 수 있다.
Orthographic SFM Summary
- feature point를 Detect하고 Tracking한다. - 각 이미지에서 중심점을 기준으로 2D 좌표를 정규화하여 matrix W를 만든다. (Centering Trick) - W에 대해 SVD를 수행하고 rank constraint를 적용한다. (W의 rank는 최대 3)
- M과 S를 set 한다.
- Q는 orthonormality constraint M을이용하여 계산한다. => SFM 해의 유일성을 보장하게 한다.
Q) multi view로 찍어서 Reconstruction 할때의 문제는?
A) 한 point가 보이는 이미지의 개수가 적어진다. / 전체 point는 많아진다.
=> Bundle Adjustment를 이용한다.
Bundle (Block) Adjustment
- 최종적으로 구해지는 3D point들의 위치를 좀 더 정확하게 하기 위한 최적화 방식 => 초기값이 필요하다! - 여러 이미지를 한 block단위로 처리한다. - camera pose와 3D point를 추정하기 위해 Error를 설계하고 이를 최소화 하는 방식
[Key idea] 1. 초기 추정값(initial guess)에서 시작한다. 2. 추정된 3D point를 camera image에 투영한다. 3. 투영된 2D 위치와 실제 위치를 비교 4. 이 차이(reprojection error)를 최소화하는 방향으로 조절
Reprojection Error
[Unknown Parameters] 1. 3D point (Xi) 2. Scale factor (λij) 3. 6D camera pose (R + T) (이미지마다) 4. 5D projection parameters (intrinsic : 보통 한 set만-하나의 카메라) 5. Distortion (q)
# Scale Factors 제거
# Normal Equations
- Linear Syetem을 바로 풀기 힘들다.
EX)
3D point 49개 3번 찍는다. 한 줄 갈때 마다 7장 찍는다. 21장을 찍었다. Reconstructure하고 싶은 point 49개 1,7,43,49번 값을 안다. Unkown 3d point 45개 한 장를 찍을 때마다 동일한 간격 (그림 상 네모)
총 21장의 이미지 중 6장은 6point, 15장은 9point 6x6 + 15x9 = 171 총 point 171개 x 2 (x,y) = 342 observation 3D point 45 x 3 = 135 Unknown Camera parameter 21 x 6 = 126 Unknown Unknown = 135 + 126 = 261Unknown
Coeffcient Matrix
=> 2줄씩 짜른다. / Cij, Bij 말고는 0을 가진다.
# C Matrix (2x3)
=> point와 observation의 관계를 나타낸 matrix
=> 2줄 당 한칸씩 2x3이 있어야 한다.
# B Matrix (2x6)
=> Camera parameter와 observation의 관계를 나타낸 matrix
=> 2줄 당 non-zero block이 한 줄씩
Sparse Coefficient Matrix
Normal Matrix
Orientation Parameters Only
- Orientation parameters만 계산하고 싶다면?
Reduced Normal System
BA(Bundle Adjustment) Summary
- BA는 least squares solution으로 initial solution이 있어야 한다. - large system을 풀 수 있다. - BA는 sparse matrix를 유도한다. => 한 이미지에 보이는 point의 개수가 전체 point에 비해 많지 않기 때문에 - sparse solvers를 사용하는 것이 key이다.