Visual SLAM - soup1997/Study-Alone GitHub Wiki

Linear Algebra

SLAMμ—μ„œ μ ‘ν•  수 μžˆλŠ” μ„ ν˜•λŒ€μˆ˜ λ¬Έμ œμ—λŠ” 크게 비동차 μ‹œμŠ€ν…œ(Non-honomegenous), 동차 μ‹œμŠ€ν…œ(Homogeneous)이 μ‘΄μž¬ν•œλ‹€.

Non-homogeneous system(Ax = b)

image

λͺ¨λ₯΄λŠ” λ―Έμ§€μˆ˜λ₯Ό $x$둜 ν‘œμ‹œν•˜κ³  μ–΄λ–€ ν˜„μƒμ΄λ‚˜ λ¬Έμ œμ— λŒ€ν•΄ κ΄€μ°°μ΄λ‚˜ μΈ‘μ •μœΌλ‘œλΆ€ν„° 얻은 μš°λ¦¬κ°€ μ•Œκ³  μžˆλŠ” 정보 ν–‰λ ¬ $A$와 벑터 $b$둜 ν‘œμ‹œν•œλ‹€. ν–‰λ ¬ A의 λͺ¨μ–‘에 따라 3가지 경우둜 λ‚˜λ‰  수 μžˆλ‹€.

  1. squared(full rank, $x=A^{-1}b$)
    ν–‰λ ¬ $A$κ°€ 정방행렬이며 Full rank(μ„ ν˜•λ…λ¦½μΈ ν–‰λ²‘ν„°μ˜ κ°―μˆ˜κ°€ ν–‰λ ¬μ˜ ν–‰μ˜ κ°―μˆ˜μ™€ 동일) κ°€μž₯ 기본적인 경우λ₯Ό μ˜λ―Έν•˜κ³  μœ μΌν•΄κ°€ μ‘΄μž¬ν•˜λŠ” κ²½μš°μ΄λ‹€. κ°„λ‹¨ν•˜κ²Œ ν–‰λ ¬ $A$의 역행렬을 κ΅¬ν•˜μ—¬ $x$λ₯Ό ꡬ할 수 μžˆλ‹€.

  2. overdetermined ($x^*=argmin||Ax-b||$)
    ν–‰λ ¬ A의 ν–‰μ˜ 크기가 μ—΄μ˜ 크기보닀 큰 경우λ₯Ό μ˜λ―Έν•˜λ©°, μ‹€μ œ μ„Έκ³„μ—μ„œ 자주 λ°œμƒν•˜λŠ” 일반적인 κ²½μš°μ΄λ‹€. λͺ¨λ“  λ‹¨μ„œλ₯Ό λ§Œμ‘±μ‹œν‚€λŠ” μ •ν™•ν•œ solution이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©° $Ax-b=0$의 근사해λ₯Ό μ°ΎλŠ” μ΅œμ†Œ 자승 문제(least-square)둜 λ³€κ²½ν•  수 μžˆλ‹€.

  3. underdetermined
    ν–‰λ ¬ A의 ν–‰μ˜ 크기가 μ—΄μ˜ 크기보닀 μž‘μ€ 경우λ₯Ό 의미, λ―Έμ§€μˆ˜μ˜ κ°œμˆ˜κ°€ λ‹¨μ„œμ˜ κ°œμˆ˜λ³΄λ‹€ λ§Žμ€ 경우이며 λ¬΄ν•œνžˆ λ§Žμ€ ν•΄κ°€ μ‘΄μž¬ν•˜κ±°λ‚˜ 이 μ‹œμŠ€ν…œμ„ λ§Œμ‘±μ‹œν‚€λŠ” ν•΄κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

Homogeneous system(Ax = 0)

μ˜λ²‘ν„°κ°€ μ•„λ‹ˆλ©΄μ„œ μœ„μ˜ μˆ˜μ‹μ„ λ§Œμ‘±μ‹œν‚€λ₯Ό 벑터 $x$λ₯Ό μ°ΎλŠ” 것이 λͺ©μ μ΄κ³  κ·ΈλŸ¬ν•œ 쑰건을 λ§Œμ‘±μ‹œν‚€λŠ” 벑터 $x$λ₯Ό ν–‰λ ¬ $A$의 null space라 ν•œλ‹€. 동차 μ‹œμŠ€ν…œμ˜ ν•΄λ₯Ό μ°ΎλŠ” λ°©λ²•μ—λŠ” SVD(Singular value Decompostion)이 μžˆλ‹€. μ΄λŠ” Eigenvalue와 Eigenvectorλ₯Ό μ΄μš©ν•œλ‹€.

Eigen Value, Eigen Vector

image

κ³ μœ³κ°’κ³Ό κ³ μœ λ²‘ν„°λŠ” μ •λ°©ν–‰λ ¬μ΄λ©΄μ„œ μ‹€μˆ˜ 값을 κ°€μ§€λŠ” λŒ€μΉ­ν–‰λ ¬ $A=A^T$에 λŒ€ν•˜μ—¬ μœ„μ˜ μˆ˜μ‹μ„ λ§Œμ‘±μ‹œν‚€λŠ” 벑터 $v$와 슀칼라 $\lambda$의 쑰합을 μ˜λ―Έν•œλ‹€. μ΄λ•Œ κ³ μœ³κ°’($\lambda$)이 0인 것에 ν•΄λ‹Ήν•˜λŠ” κ³ μœ λ²‘ν„°($v$)λ₯Ό 찾으면 $Av=0v=0$을 λ§Œμ‘±ν•œλ‹€.그것이 λ°”λ‘œ 동차 μ‹œμŠ€ν…œ $Av=0$의 ν•΄κ°€ 되고 ν–‰λ ¬ $A$에 λŒ€ν•œ null spaceκ°€ λœλ‹€.

Singular value, Singular vector

일반적인 μ„ ν˜•μ‹œμŠ€ν…œμ—μ„œ ν–‰λ ¬ $A$κ°€ 정방행렬인 κ²½μš°λŠ” 거의 λ“œλ¬Όκ³  λŒ€λΆ€λΆ„ λΉ„μ •λ°©(Non-squared)행렬이닀. κ³ μœ³κ°’κ³Ό κ³ μœ λ²‘ν„°μ˜ μ„±μ§ˆμ„ μœ μ§€ν•˜λ©΄μ„œ λΉ„μ •λ°© ν–‰λ ¬μ˜ 경우둜 ν™•μž₯된 κ°œλ…μ΄ λ°”λ‘œ νŠΉμ΄κ°’κ³Ό νŠΉμ΄λ²‘ν„°μ΄λ‹€.

image

λΉ„μ •λ°© ν–‰λ ¬ $A$λŠ” μ™Όμͺ½ νŠΉμ΄λ²‘ν„°λ“€μ΄ ν–‰λ²‘ν„°λ‘œ κ΅¬μ„±λœ 직ꡐ행렬 $U$와 νŠΉμ΄κ°’λ“€μ΄ λŒ€κ°μ„±λΆ„μœΌλ‘œ κ΅¬μ„±λœ λŒ€κ°ν–‰λ ¬ $D$, 였λ₯Έμͺ½ νŠΉμ΄λ²‘ν„°λ“€μ΄ μ—΄λ²‘ν„°λ‘œ κ΅¬μ„±λœ 직ꡐ행렬 $V$둜 λΆ„ν•΄λœλ‹€.

image

λŒ€κ° ν–‰λ ¬ $D$의 νŠΉμ΄κ°’λ“€μ€ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ ν–‰λ ¬μ˜ μ™Όμͺ½ μœ„λΆ€ν„° 였λ₯Έμͺ½ μ•„λž˜κΉŒμ§€ λ°°μΉ˜λ˜λŠ”λ°, κ°€μž₯ μž‘μ€ νŠΉμ΄κ°’μ— ν•΄λ‹Ήν•˜λŠ” 였λ₯Έμͺ½ νŠΉμ΄λ²‘ν„°λ₯Ό 찾으면 그것이 λ°”λ‘œ μ„ ν˜•μ‹œμŠ€ν…œ $Ax=0$의 λΉ„μžλͺ…ν•΄(Non-trivial solution)이 λœλ‹€. μ—¬κΈ°μ„œ λΉ„μžλͺ…ν•΄λŠ” $||Ax||$λ₯Ό μ΅œμ†Œν™” μ‹œν‚€λŠ” λ‹¨μœ„λ²‘ν„° $x$λ₯Ό μ˜λ―Έν•œλ‹€.

Skew-symmetric matrix(A.transpose() = -A)

λ°˜λŒ€μΉ­ 행렬은 μ–΄λ–€ ν–‰λ ¬ $A$에 λŒ€ν•˜μ—¬ transpose ν–ˆμ„ λ•Œ 자기 μžμ‹ μ— 음수λ₯Ό κ³±ν•œ 행렬이 λ‚˜μ˜€λŠ” 행렬을 μ˜λ―Έν•œλ‹€. μ΄λŸ¬ν•œ λ°˜λŒ€μΉ­ ν–‰λ ¬μ˜ νŠΉμ„±μ„ μ΄μš©ν•˜λŠ” μ˜ˆμ œκ°€ λŒ€ν‘œμ μœΌλ‘œ 두 벑터 μ‚¬μ΄μ˜ 외적(Cross product)을 λ°˜λŒ€μΉ­ ν–‰λ ¬κ³Ό 벑터 μ‚¬μ΄μ˜ κ³±μ…ˆμœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.

image

Non-linear optimization theorem

SLAM μ‹œμŠ€ν…œμ—μ„œ 자주 μ ‘ν•˜λŠ” μ„ ν˜• μ‹œμŠ€ν…œμ˜ ν˜•νƒœμΈ Over-determinedμ‹œμŠ€ν…œμ„ ν‘ΈλŠ” 방법이닀. 근사해λ₯Ό μ°ΎκΈ° μœ„ν•œ λŒ€ν‘œμ μΈ λ°©λ²•μœΌλ‘œ 경사 ν•˜κ°•λ²•(Gradient descent method), κ°€μš°μŠ€-뉴턴법(Gauss-Newton method), λ§ˆμ§€λ§‰μœΌλ‘œ 이 λ‘˜μ˜ 쑰합인 λ₯΄λ²€λ²„κ·Έ-λ§ˆμΏΌνŠΈλ²•(Levenberg-Marquardt method)κ°€ μ‘΄μž¬ν•œλ‹€.

Least suqare problem

Over-determined μ‹œμŠ€ν…œμ€ λ‹¨μ„œμ˜ κ°œμˆ˜κ°€ λ―Έμ§€μˆ˜μ˜ κ°œμˆ˜λ³΄λ‹€ λ§Žμ„ λ•Œ λ§Œλ“€μ–΄μ§€λŠ” μ„ ν˜• μ‹œμŠ€ν…œμ΄κ³  λͺ¨λ“  λ‹¨μ„œλ₯Ό λ§Œμ‘±μ‹œν‚€λŠ” μ—„λ°€ν•΄κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ΄λ‹€. λ”°λΌμ„œ λͺ¨λ“  λ‹¨μ„œμ— λŒ€ν•΄ μ–΄λŠ 정도 λ§Œμ‘±μ‹œν‚€λŠ” 근사해λ₯Ό μ°ΎλŠ”λ‹€. μ˜ˆμ‹œλ‘œ λ‹€μŒκ³Ό 같은 μˆ˜μ‹μ„ μ„ ν˜•μ‹œμŠ€ν…œμœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

$ax_{i}^2+bx_i+c=y_i$

image

μ΄λŠ” $Ax=b$ν˜•νƒœμ˜ Over-determined μ„ ν˜• μ‹œμŠ€ν…œμ΄λ‹€!

μ΄λŸ¬ν•œ μ‹œμŠ€ν…œμ˜ μ—„λ°€ν•΄λ₯Ό μ°ΎλŠ” 것은 λ‹€μ‹œ λ§ν•˜λ©΄ λͺ¨λ“  ν¬μΈνŠΈλ“€μ„ μ§€λ‚˜κ°€λŠ” μ§μ„ μ˜ 방정식을 μ°ΎλŠ” 것과 κ°™κ³  그런 ν•΄λŠ” λŒ€μˆ˜μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•œ 해이닀. λ”°λΌμ„œ 이 μ‹œμŠ€ν…œμ„ μ΅œμ†Œ 제곱 문제둜 λ³€ν˜•ν•˜μ—¬ 근사해λ₯Ό μ°ΎλŠ” 문제둜 λ§Œλ“€κΈ° μœ„ν•΄μ„œ 각 ν¬μΈνŠΈλ“€μ˜ μ‹€μ œ κ΄€μΈ‘κ°’κ³Ό 예츑 κ°’ μ‚¬μ΄μ˜ 차이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κΈ°λ³Έ 였차λ₯Ό μ •μ˜ν•œλ‹€.

$e_i(x)=A_{i}x+b_i$ , loss function이 평균이 0이고 곡뢄산이 $\Sigma$인 gaussian distribution을 λ”°λ₯Έλ‹€κ³  κ°€μ •

μ΅œμ’…μ μœΌλ‘œ μ •μ˜λ˜λŠ” 제곱 μ˜€μ°¨ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

$E_i(x)=e_i^T(x)\Sigma^{-1}e_i(x)$

μ—¬κΈ°μ„œ $\Sigma^{-1}=\Omega$이며 Information matrix라고 μΉ­ν•œλ‹€. 즉 곡뢄산이 크면 λ°μ΄ν„°μ˜ 뢄포가 λ„“κ²Œ νΌμ ΈμžˆμœΌλ―€λ‘œ information은 μž‘κ³ , 곡뢄산이 μž‘μœΌλ©΄ λ°μ΄ν„°μ˜ 뢄포가 μž‘μœΌλ―€λ‘œ information크닀. κ²°κ΅­, μ΅œμ ν™” μ‹œμ— $i$번째 포인트의 영ν–₯도λ₯Ό κ°€μ€‘μΉ˜λ‘œ λ‚˜νƒ€λ‚Έ 것을 μ˜λ―Έν•œλ‹€.

λ”°λΌμ„œ global loss function은 λ‹€μŒκ³Ό κ°™λ‹€.

$F(x)=\Sigma_i{(e_i^T(x)\Sigma^{-1}e_i(x))}$

근사해λ₯Ό μ°ΎκΈ° μœ„ν•œ μ΅œμ ν™” μˆ˜μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.

$x^*=argmin_{x}{F(x)}$

$x^*=argmin_{x}\Sigma_i{(e_i^T(x)\Sigma^{-1}e_i(x))}$

μ΄λŸ¬ν•œ μ΅œμ†Œ 제곱 λ¬Έμ œλŠ” ν•œλ²ˆμ˜ 연산을 톡해 μ§μ ‘μ μœΌλ‘œ ν•΄λ₯Ό ꡬ할 수 μ—†κ³  iterativeν•˜κ²Œ ν•΄μ˜ 값을 μ‘°κΈˆμ”© μ—…λ°μ΄νŠΈ ν•΄κ°€λ©° μˆ˜λ ΄ν•˜λŠ” 지점을 μ°Ύμ•„μ•Ό ν•œλ‹€.

Gradient descent method

κ²½μ‚¬ν•˜κ°• 방법은 μ „μ—­ 였차 ν•¨μˆ˜ $F(x+\Delta x)$의 κ²°κ³Όκ°€ μ΅œμ†Œκ°€ λ˜λ„λ‘ λ§Œλ“œλŠ” $\Delta x$λ₯Ό μ°ΎκΈ° μœ„ν•΄ 벑터 $x$μ—μ„œμ˜ 1μ°¨ 미뢄인 Gradientλ₯Ό μ΄μš©ν•˜λŠ” 방법이닀.

image

μœ„μ˜ μˆ˜μ‹μ€ λ‹€μŒκ³Ό 같이 정리할 수 μžˆλ‹€.

$\nabla E_{i}(x)=2J_{i}^T(x) \Omega_i e_i(x)$

이 기울기 값을 μ΄μš©ν•΄ κ΅¬ν•˜λ €λŠ” μ΅œμ ν•΄μΈ $\Delta x$λ₯Ό μ •μ˜ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

$\Delta x=\Sigma_i{\lambda\nabla_{i}(x)=\Sigma_i(2\lambda J_{i}^T(x) \Omega_i e_i(x))}$

κ²°κ΅­ 슀칼라 값인 step size라고 μΉ­ν•˜λŠ” $\lambda$λŠ” 일반적인 λ¨Έμ‹ λŸ¬λ‹μ—μ„œ ν•™μŠ΅λ₯ (learning rate)와 λ™μΌν•œ 의미λ₯Ό μ§€λ‹Œλ‹€. $x^*\leftarrow x + \lambda\frac{\partial F}{\partial x}=x+\Delta x$

Gauss-Newton method

κ°€μš°μŠ€-뉴턴 방법은 μ „μ—­ 였차 ν•¨μˆ˜ $F(x+\Delta x)$의 κ²°κ³Όκ°€ μ΅œμ†Œκ°€ λ˜λ„λ‘ λ§Œλ“œλŠ” $\Delta x$λ₯Ό μ°ΎκΈ° μœ„ν•΄ 2μ°¨ 미뢄인 곑λ₯ (Curvature)의 근삿값을 μ‚¬μš©ν•œλ‹€. κΈ°λ³Έ 였차 ν•¨μˆ˜ $e_i(x+\Delta x)$λ₯Ό taylor expansion을 μ΄μš©ν•˜μ—¬ μˆ˜μ‹μœ λ„λ₯Ό ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

$e_i(x+\Delta x)\approx e_i(x)+J_i(x)\Delta x$

$J_i(x)$였차 ν•¨μˆ˜μ˜ 벑터 $x$에 λŒ€ν•œ 미뢄을 μ˜λ―Έν•˜λŠ” μžμ½”λΉ„μ•ˆ 행렬이닀.

image image

μ΄λ ‡κ²Œ μœ λ„λœ μ „μ—­ 였차 ν•¨μˆ˜ $F(x+\Delta x)$에 λŒ€ν•΄ $\Delta x$둜 λ―ΈλΆ„ν•΄μ„œ 0이 λ˜λŠ” 값을 찾으면 μ „μ—­ 였차 ν•¨μˆ˜μ˜ κ²°κ³Όκ°€ μ΅œμ†Œκ°€ λ˜λ„λ‘ λ§Œλ“œλŠ” μ΅œμ ν•΄λ₯Ό 찾을 수 μžˆλ‹€.

$F(x+\Delta x)\approx c+2b^T\Delta x+\Delta x^TH\Delta x$

$\frac{\partial F(x+\Delta x)}{\partial\Delta x}\approx 2b+2H\Delta x$

$0 = 2b + 2H\Delta x$

$H\Delta x=-b$

$\Delta x = -H^{-1}b$

κ°€μš°μŠ€-뉴턴 방법은 곑λ₯ μ„ μ΄μš©ν•΄ ν•΄λ₯Ό μ°ΎκΈ° λ•Œλ¬Έμ— κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ 더 μ λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ 역행렬을 ꡬ할 λ•Œ 수치적으둜 λΆˆμ•ˆμ •ν•˜κ³  ν•΄κ°€ λ°œμ‚°ν•  μœ„ν—˜μ΄ μžˆλ‹€λŠ” 단점이 μ‘΄μž¬ν•œλ‹€.

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <chrono>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace Eigen;

int main(int argc, char** argv){
 double ar = 1.0, br = 2.0, cr = 1.0; // real value(μ‹€μ œ ν•΄)
 double ae = 2.0, be = -1.0, ce = -5.0 // init value(μ΅œμ ν™”λ₯Ό 톡해 μ—…λ°μ΄νŠΈλ˜λŠ” λ³€μˆ˜)
 int N = 100; // λ°μ΄ν„°μ˜ 총 갯수

 double w_sigma = 1.0;
 double inv_sigma = 1.0 / w_sigma;
 cv::RNG rng;

 vector<double> x_data, y_data;

 for(int i = 0; i < N; i++){
  double x = i / 100.0;
  x_data.push_back(x); // λͺ¨λΈμ˜ μž…λ ₯κ°’
  y_data.push_back(exp(ar * x * x + br * x + cr) + rng.gaussian(w_sigma * w_sigma)); // λͺ¨λΈμ˜ 좜λ ₯κ°’ 계산 및 κ°€μš°μ‹œμ•ˆ λ…Έμ΄μ¦ˆ μΆ”κ°€
 }
 
 int iterations = 100;
 double cost = 0, last_cost = 0;

 // least squre
 chrono::stead_clock::time_point t1 = chrono::steady_clock::now();
 for(int iter = 0; iter < iterations; iter++){
  Matrix3d H = Matrix3d::Zero(); // ν–‰λ ¬ H(μ˜ν–‰λ ¬)
  Vector3d b = Vector3d::Zero(); // 벑터 b(μ˜λ²‘ν„°)
  cost = 0;
  
  for(int i = 0; i < N; i++){
   double xi = x_data[i], yi = y_data[i];
   double error = yi - exp(ae * xi * xi + be * xi + ce);
   Vector3d J;
   
   // Jacobian calculation
   J[0] = -xi * xi * exp(ae * xi * xi + be * xi + ce); // ae에 λŒ€ν•œ νŽΈλ―ΈλΆ„
   J[1] = -xi * exp(ae * xi * xi + be * xi + ce); // be에 λŒ€ν•œ νŽΈλ―ΈλΆ„
   J[2] = -exp(ae * xi * xi + be * xi + ce); // ce에 λŒ€ν•œ νŽΈλ―ΈλΆ„

   H += inv_simga * inv_sigma * J * J.transpose();
   b += -inv_simga * inv_sigma * error * J;
   
   cost += error * error;
  }
  
  Vector3d dx = H.ldlt.solve(b); // cholesky decomposition
  
  if (iter > 0 && cost >= lastCost){
   cout << "cost:" << cost << ">= last cost:" << lastCost << ", break." << endl;
   break;
  }

  ae += dx[0];
  be += dx[1];
  ce += dx[2];
  
  lastCost = cost;
 }
 chorono::steady_cllock::time_point t2 = chrono::stead_clock::now();
 chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2-t1)
 cout << "estimated abc :" << ae << be << ce << endl
}

Projective Geomtry(μ‚¬μ˜κΈ°ν•˜ν•™)

image

vanishing point(μ†Œμ‹€μ )같은 ν˜„μƒμ΄ λ‚˜νƒ€λ‚˜λŠ” μ΄μœ λŠ” 원근법에 μ˜ν•œ 것이닀. 즉, ν˜„μ‹€μ„Έκ³„μ—μ„œλŠ” ν‰ν–‰ν•˜μ§€λ§Œ μ‚¬μ˜λœ κ³΅κ°„μ—μ„œλŠ” κ΅μ°¨ν•˜λŠ” ν˜„μƒμ΄ λ°œμƒν•œλ‹€. 이둜 인해 3d 곡간을 λ‹€λ£° λ•Œ ν•„μš”ν•œ μœ ν΄λ¦¬λ“œ κΈ°ν•˜ν•™μ΄ 이미지λ₯Ό λ‹€λ£°λ•ŒλŠ” 적용이 될 수 μ—†λ‹€. μ‚¬μ˜μ„ 톡해 μ†Œμ‹€λ˜λŠ” 값은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. Depth(거리)
  2. Orthogonality(직ꡐ성) - 3d κ³΅κ°„μ—μ„œλŠ” μ§κ΅ν•˜λŠ” 물체가 이미지 μƒμ—μ„œ μ§κ΅ν•˜μ§€ μ•ŠμŒ
  3. Parallelism(평행성) - 3d κ³΅κ°„μ—μ„œλŠ” ν‰ν–‰ν•˜λ˜ 물체가 이미지 μƒμ—μ„œ ν‰ν–‰ν•˜μ§€ μ•ŠμŒ
  4. Scale(λΉ„μœ¨) - 3d κ³΅κ°„μ—μ„œλŠ” λ™μΌν•œ 크기λ₯Ό 가짐에도 κ°€κΉŒμ΄ μžˆλŠ” λ¬Όμ²΄λŠ” 크게 λ‚˜νƒ€λ‚˜κ³  멀리 μžˆλŠ” λ¬Όμ²΄λŠ” μž‘κ²Œ λ‚˜νƒ€λ‚¨

μœ ν΄λ¦¬λ“œ λ³€ν™˜κ³Ό κ°€μž₯ 큰 차이점은 μœ ν΄λ¦¬λ“œ λ³€ν™˜μ€ λ³€ν™˜ μ „κ³Ό ν›„μ˜ 물체의 길이, 직ꡐ성, 평행성, λΉ„μœ¨ 등을 μœ μ§€ν•΄μ•Ό ν•˜λŠ” μ œμ•½ 쑰건이 μ‘΄μž¬ν•˜μ§€λ§Œ μ‚¬μ˜ λ³€ν™˜(projective transformation)은 이λ₯Ό λͺ¨λ‘ μœ μ§€ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” 것이닀. 즉, 3d κ³΅κ°„μ—μ„œλŠ” λ¬΄ν•œμ˜ 거리λ₯Ό 2d μ΄λ―Έμ§€μ—μ„œλŠ” μœ ν•œν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. μ΄λ•Œ μ‚¬μ˜ κΈ°ν•˜ν•™μ—μ„œ μ‚¬μš©ν•˜λŠ” μ’Œν‘œκ³„λ₯Ό 동차 μ’Œν‘œκ³„(Homogeneous coordinates)라고 ν•œλ‹€.

Example

image

λ‘κ°œμ˜ 벑터 {1, 2, 3}, {2, 4, 6}이 μ‘΄μž¬ν•  λ•Œ μœ ν΄λ¦¬λ“œ κΈ°ν•˜ν•™μ—μ„œλŠ” 두 λ²‘ν„°λŠ” λ‹€λ₯Έ 값을 가지고 있기 λ•Œλ¬Έμ— λ‹€λ₯Έ μ’Œν‘œλ₯Ό κ°€λ¦¬ν‚€λŠ” 것을 μ˜λ―Έν•œλ‹€. ν•˜μ§€λ§Œ μ‚¬μ˜κΈ°ν•˜ν•™μ˜ 동차 μ’Œν‘œκ³„μ—μ„œλŠ” {2, 4, 6}의 μ΅œλŒ€ κ³΅μ•½μˆ˜μΈ 2둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ {1, 2, 3}이 되고 λ‘κ°œμ˜ λ²‘ν„°λŠ” 같은 μ’Œν‘œλ₯Ό 가리킨닀고 λ³Ό 수 μžˆλ‹€. 즉, μœ„μ—μ„œ μ •μ˜ν–ˆλ˜ λΉ„μœ¨μ— λŒ€ν•œ μ œμ•½μ‘°κ±΄μ„ μœ μ§€ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” 것을 μ˜λ―Έν•˜λŠ” λŒ€ν‘œμ μΈ μ˜ˆμ œμ΄λ‹€. 결둠적으둜 벑터 전체λ₯Ό λΉ„μœ¨κ°’μœΌλ‘œ λ‚˜λˆˆλ‹€λ©΄ λ³€ν•˜μ§€ μ•ŠλŠ” 물체의 μ§„μ§œ 크기둜 λŒμ•„κ°„λ‹€λŠ” 점을 μ˜λ―Έν•œλ‹€.

image

μœ„μ˜ κ·Έλ¦Όμ—μ„œ $u, v$λŠ” 2차원 μΆ• λ°©ν–₯을 λ‚˜νƒ€λ‚΄λ©°, $w$λŠ” λΉ„μœ¨ κ°’μ˜ 좕이닀. λΉ„μœ¨ 값이 1둜 λ˜μ–΄μžˆλŠ” 곡간이 2d μœ ν΄λ¦¬λ“œ 곡간이닀. 이λ₯Ό 톡해 μœ ν΄λ¦¬λ“œ 곡간은 μ‚¬μ˜ κ³΅κ°„μ˜ λΆ€λΆ„μ§‘ν•©μ΄λΌλŠ” 점을 μ•Œ 수 μžˆλ‹€. 특히, 2D μœ ν΄λ¦¬λ“œ κ³΅κ°„μ—μ„œ 점으둜 ν‘œν˜„λ˜λŠ” 곡간은 μ‚¬μ˜ κ³΅κ°„μ—μ„œλŠ” {0, 0, 0}μ—μ„œ μ‹œμž‘ν•˜μ—¬ {x, y, 1}을 μ§€λ‚˜ {wx, wy, w}둜 μ—°μž₯λ˜λŠ” 직선이 λœλ‹€. λ”°λΌμ„œ μ‚¬μ˜ κΈ°ν•˜ν•™μ˜ μ •μ˜λŠ” νˆ¬μ˜μ„ ν†΅ν•œ N+1 μ°¨μ›μ—μ„œ Nμ°¨μ›μœΌλ‘œμ˜ 차원 μΆ•μ†Œλ₯Ό μœ„ν•œ κΈ°ν•˜ν•™μž„μ„ λ‚˜νƒ€λ‚Έλ‹€.

image

ν–‰λ ¬ λ˜ν•œ 동차 μ’Œν‘œκ³„λ‘œ ν‘œν˜„λ  수 μžˆλ‹€. SO(3) νšŒμ „ λ§€νŠΈλ¦­μŠ€λŠ” μœ ν΄λ¦¬λ“œ κ³΅κ°„μ—μ„œ 데카λ₯΄νŠΈ μ’Œν‘œκ³„λ‘œ ν‘œν˜„λ˜λŠ” 3x3 ν˜•νƒœμ˜ 행렬이닀. 이 행렬을 μ‚¬μ˜ κ³΅κ°„μ—μ„œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν–‰λ ¬μ˜ 차원을 ν•˜λ‚˜ μ¦κ°€μ‹œν‚€κ³  우츑 μ΅œν•˜λ‹¨ 항에 1을 μœ„μΉ˜μ‹œν‚¨λ‹€. SE(3) λ³€ν™˜ 행렬은 μœ ν΄λ¦¬λ“œ κ³΅κ°„μ—μ„œ 6 DOF κ°•μ²΄μš΄λ™μ„ ν‘œν˜„ν•˜λŠ” 4x4ν˜•νƒœμ˜ 행렬이닀. SO(3), SE(3) ν–‰λ ¬ λͺ¨λ‘ 우츑 μ΅œν•˜λ‹¨ 값이 1둜 λ˜μ–΄μžˆλŠ” 경우λ₯Ό λ³Ό 수 μžˆλŠ”λ°, μ΄λŠ” μœ ν΄λ¦¬λ“œ κ³΅κ°„μ—μ„œμ˜ λ³€ν™˜μ„ μˆ˜ν–‰ν•˜κ³  μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

Local feature

νŠΉμ§•μ μ€ Object detection, Tracking, Matchingκ³Ό 같은 CV의 μ˜μ—­μ—μ„œ μ‚¬μš©λ˜λŠ” κΈ°μˆ μ΄λ‹€. νŠΉμ§•μ μ€ 크게 2개둜 이루어져 μžˆλ‹€.

  1. Keypoint(ν‚€ν¬μΈνŠΈ) - μ½”λ„ˆ, 엣지, μ˜μ—­(blob)κ³Ό 같이 이미지 속 λ‘λ“œλŸ¬μ§€λŠ” μ„±μ§ˆμ„ 가진 μ˜μ—­
  2. Descriptor(기술자) - 이미지 속 ν‚€ν¬μΈνŠΈκ°€ μœ„μΉ˜ν•œ μ˜μ—­ 주변이 μ–΄λ–»κ²Œ 생겼고 μ–΄λ– ν•œ μ‹œκ°μ  μš”μ†Œλ₯Ό 가지고 μžˆλŠ”μ§€ ν‘œν˜„ν•˜λŠ” 벑터

이λ₯Ό 톡해 효율적으둜 μ„œλ‘œ λ‹€λ₯Έ μž„μ§€ μ†μ—μ„œ λ™μΌν•œ 물체λ₯Ό μ˜λ―Έν•˜λŠ” 뢀뢄을 μ°Ύμ•„ 이미지 맀칭을 μˆ˜ν–‰ν•˜κ³ , 이λ₯Ό 톡해 두 이미지 κ°„μ˜ μ΄λ™μ΄λ‚˜ 3D 곡간이 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ–΄μžˆλŠ”μ§€ μΆ”λ‘ ν•  수 μžˆλ‹€.

Parameters of Camera

μΉ΄λ©”λΌμ˜ νŒŒλΌλ―Έν„°λŠ” worldλ₯Ό κ΅¬μ„±ν•˜κ³  μžˆλŠ” 3차원 μ’Œν‘œκ°€ μ–΄λ–»κ²Œ μΉ΄λ©”λΌμ˜ 2차원 ν”½μ…€λ‘œ λ³€ν™˜λ˜λŠ”μ§€ μˆ˜μ‹μ μœΌλ‘œ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 값이닀.

image image

image

$x$λŠ”[3X1] μΉ΄λ©”λΌμ˜ 이미지 평면에 μ‚¬μ˜λœ 2차원 ν”½μ…€ μ’Œν‘œλ₯Ό λ™μ°¨μ’Œν‘œκ³„λ‘œ λ‚˜νƒ€λ‚Έκ°’μ΄λ‹€.
$P$[3X4]λŠ” 카메라 νŒŒλΌλ―Έν„°λ‘œ κ΅¬μ„±λœ ν–‰λ ¬λ‘œμ„œ 카메라 λ‚΄λΆ€ νŒŒλΌλ―Έν„°μ™€ μ™ΈλΆ€ νŒŒλΌλ―Έν„°μ˜ μ‘°ν•©μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
κ²°κ΅­ 카메라 μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜ κ³Όμ •μ΄λž€ $P$λ₯Ό κ΅¬ν•˜λŠ” 과정을 μ˜λ―Έν•˜λŠ” 것이닀.

Parameters μ„€λͺ…
Extrinsic world μ’Œν‘œκ³„μ—μ„œ camera μ’Œν‘œκ³„λ‘œ λ³€ν™˜ν•˜λŠ”λ° ν•„μš”ν•œ νŒŒλΌλ―Έν„°(from $S_O$ to $S_k$)
Intrinsic camera μ’Œν‘œκ³„μ—μ„œ image μ’Œν‘œκ³„λ₯Ό 거쳐 sensor μ’Œν‘œκ³„λ‘œ λ³€ν™˜ν•˜λŠ”λ° ν•„μš”ν•œ νŒŒλΌλ―Έν„°, 카메라 distortion νŒŒλΌλ―Έν„° 포함(from $S_k$ to $S_s$)

Extrinsic Parameters

μΉ΄λ©”λΌμ˜ μ™ΈλΆ€ νŒŒλΌλ―Έν„°λŠ” world μ’Œν‘œκ³„λ₯Ό κΈ°μ€€μœΌλ‘œ μƒλŒ€μ μΈ μΉ΄λ©”λΌμ˜ μžμ„Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 값이며 3μžμœ λ„μ˜ 카메라 이동 νŒŒλΌλ―Έν„°μ™€ 3 μžμœ λ„μ˜ 카메라 νšŒμ „ νŒŒλΌλ―Έν„°λ₯Ό 가진닀. 즉 μœ ν΄λ¦¬λ“œκ³΅κ°„μ—μ„œμ˜ λ³€ν™˜ 행렬을 κ΅¬ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

KakaoTalk_20230922_184118143

μœ„μ˜ κ·Έλ¦Όκ³Ό 같이 world μ’Œν‘œκ³„ 상에 점 $P$κ°€ μ‘΄μž¬ν•  λ•Œ 점 $P$의 μ’Œν‘œλ₯Ό $X_p=[X_p, Y_p, Z_p]^T$라 μ •μ˜ν•˜κ³  카메라 $O$의 μ€‘μ‹¬μ’Œν‘œλ₯Ό $X_o=[X_o, Y_o, Z_o]^T$라 κ°€μ •ν–ˆμ„λ•Œ camera μ’Œν‘œκ³„λ₯Ό κΈ°μ€€μœΌλ‘œ 점 $P$의 μ’Œν‘œλ₯Ό ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

${X_p}^k=R(X_p-X_o)$

μ΄λŠ” 점 $P$의 world μ’Œν‘œμ—μ„œ camera μ€‘μ‹¬μ’Œν‘œ $O$λ₯Ό λΉΌκ³  μΉ΄λ©”λΌμ˜ νšŒμ „ ν–‰λ ¬ $R$을 κ³±ν•˜λ©΄ camera μ’Œν‘œκ³„μ—μ„œ 바라본 점 $P$의 μ’Œν‘œλŠ” ${X_p}^k$둜 λ‚˜νƒ€λ‚Έλ‹€.

image

즉 $H$λŠ” 일반적인 μœ ν΄λ¦¬λ“œ κ³΅κ°„μ—μ„œ SE(3) λ³€ν™˜ 행렬을 μ˜λ―Έν•˜λŠ” 것이닀.

Intrinsic Parameters

μΉ΄λ©”λΌμ˜ λ‚΄λΆ€ νŒŒλΌλ―Έν„°λŠ” 3차원 점 $P$κ°€ 카메라 μ’Œν‘œκ³„ $S_k$μ—μ„œ μ˜μƒ μ’Œν‘œκ³„ $S_c$λ₯Ό 거쳐 μ„Όμ„œ μ’Œν‘œκ³„ $S_s$κΉŒμ§€ λ„λ‹¬ν•˜λŠ”λ° ν•„μš”ν•œ λ³€ν™˜ νŒŒλΌλ―Έν„°λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 각 단계별 μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. 원근 μ‚¬μ˜ λ³€ν™˜
  2. μ˜μƒ μ’Œν‘œμ—μ„œ μ‹€μ œ μ„Όμ„œ μ’Œν‘œ λ³€ν™˜
  3. 랜즈 μ™œκ³‘ λ³€ν™˜

원근 μ‚¬μ˜ λ³€ν™˜(Perspective projection transformation)

원근 μ‚¬μ˜ λ³€ν™˜μ€ 핀홀 카메라 λͺ¨λΈμ—μ„œ μ™œκ³‘μ΄ μ—†λŠ” 렌즈λ₯Ό κ°€μ •ν•˜μ—¬ 3차원 점 $P$κ°€ 2차원 이미지 ν”½μ…€ $\bar{P}$둜 λ³€ν™˜λ˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.

KakaoTalk_20230922_184938429

μœ„μ˜ κ·Έλ¦Όμ—μ„œ $c$λŠ” 이미지 ν‰λ©΄μ—μ„œ 렌즈 쀑심(optical center)κΉŒμ§€μ˜ 거리인 초점 거리λ₯Ό μ˜λ―Έν•œλ‹€. 두 직각 μ‚Όκ°ν˜•μ˜ 비둀식을 톡해 이미지 μƒμ—μ„œμ˜ $x, y$μ’Œν‘œλ₯Ό κ΅¬ν•˜λŠ” μ ˆμ°¨λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

KakaoTalk_20230922_185246532 KakaoTalk_20230922_185448951

μ˜μƒ μ’Œν‘œμ—μ„œ μ‹€μ œ μ„Όμ„œ μ’Œν‘œ λ³€ν™˜

μ˜μƒ μ’Œν‘œμ—μ„œ μ‹€μ œ μ„Όμ„œ μ’Œν‘œ λ³€ν™˜μ€ 두 μ’Œν‘œκ³„μ˜ 쀑심이 μΌμΉ˜ν•˜μ§€ μ•Šκ³  물체에 λŒ€ν•œ 상이 λ§ΊνžˆλŠ” μ‹€μ œ μ„Όμ„œμ˜ κ°€λ‘œμ„Έλ‘œ μΆ•μ˜ λΉ„μœ¨μ΄ λ™μΌν•˜μ§€ μ•Šμ€ 차이λ₯Ό affine λ³€ν™˜μ„ ν™œμš©ν•˜μ—¬ λ³΄μ •ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.

image image

μœ„μ˜ κ·Έλ¦Όκ³Ό 같이 μ˜μƒ μ’Œν‘œκ³„ $S_c$의 쀑심은 2차원 μ˜μƒ 평면에 쀑앙에 μœ„μΉ˜ν•΄ μžˆμ§€λ§Œ μ‹€μ œ μ„Όμ„œ μ’Œν‘œκ³„ $S_s$의 쀑심은 2차원 μ˜μƒ ν‰λ©΄μ˜ μ’Œμƒλ‹¨μ— μœ„μΉ˜ν•΄ μžˆλ‹€. μ΄λŸ¬ν•œ 차이λ₯Ό affine λ³€ν™˜ ν–‰λ ¬ ${H_c}^s$둜 λ‚˜νƒ€λ‚΄μ–΄ ν–‰λ ¬μ˜ μš°μƒλ‹¨μ—λŠ” 두 μ’Œν‘œκ³„μ˜ 원점 μ‚¬μ΄μ˜ 거리 차이 $[x_H, y_H]^T$λ₯Ό λ„£κ³  λŒ€κ° 성뢄에 κ°€λ‘œμ„Έλ‘œ μΆ•μ˜ λΉ„μœ¨ 차이 $m$을 λ„£μ–΄ ν‘œν˜„ν•  수 μžˆλ‹€.

렌즈 μ™œκ³‘ λ³€ν™˜

μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ μ’Œν‘œκ³„ μ‚¬μ΄μ˜ λ³€ν™˜ 과정은 렌즈의 μ™œκ³‘ κ³„μˆ˜λ₯Ό κ³ λ €ν•˜κ³  μžˆμ§€ μ•Šλ‹€. λ”°λΌμ„œ μ„Όμ„œ μ’Œν‘œκ³„μ—μ„œ $S_s$μ—μ„œ 렌즈의 μ™œκ³‘μ„ κ³ λ €ν•œ μ„Όμ„œ μ’Œν‘œκ³„ $S_a$λ₯Ό μΆ”κ°€μ μœΌλ‘œ κ³ λ €ν•˜μ—¬ ν™”μ†Œμ˜ μœ„μΉ˜λ₯Ό μ •ν™•ν•˜κ²Œ 계산할 수 μžˆλ‹€.

image

μ΄λŸ¬ν•œ μ™œκ³‘ λͺ¨λΈμ„ κ°€μ§ˆ 경우 μ„Όμ„œ μ’Œν‘œκ³„ $S_s$의 점 $X^s=[x^s, y^s]$에 λŒ€ν•΄ $\delta X=[\delta x, \delta y]$을 λ”ν•˜λŠ” ν˜•νƒœλ‘œ ꡬ성이 λœλ‹€.
$\delta x$λŠ” μ„Όμ„œ μ’Œν‘œκ³„μ—μ„œ μ’Œν‘œ κ°’κ³Ό μ™œκ³‘ νŒŒλΌλ―Έν„°λ₯Ό μž…λ ₯으둜 κ°€μ§€λŠ” λΉ„μ„ ν˜• ν•¨μˆ˜λ‘œμ„œ μ™œκ³‘ λͺ¨λΈμ— 따라 λ‹€λ₯΄κ²Œ μ •μ˜λœλ‹€. 배럴 μ™œκ³‘ λͺ¨λΈμ˜ $\delta X$λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

$\delta{x}=q_1 r^2 + q_2 r^4$

$\delta{y}=q_1 r^2 + q_2 r^4$

image image

결둠적으둜 μ΅œμ’…μ μΈ camera calibration matrix $P$λŠ” λ‹€μŒκ³Ό 과정을 톡해 κ΅¬ν•΄μ§„λ‹€λŠ” 것이닀.

KakaoTalk_20230922_190111844

⚠️ **GitHub.com Fallback** ⚠️