Stereo Matching

Stereo Matching

source

($f$:focal length, $p^l, p^r$:image point(left, right), $P$:world point, $Z$:depth of $P$) (length of Baseline을 $t$라고 하자. 그리고 $x_l$은 $O_l$을 기준으로 한 선으로부터 음의 방향으로 $p_l$까지의 거리, $x_r$은 $O_r$을 기준으로 한 선으로부터 양의 방향으로 $p_r$까지의 거리이다.)

그러면 $\triangle(p_l, P, p_r)$과 $\triangle(O_l, P, O_r)$은 닮음이므로

이 성립하므로,

이 성립하는데, 이때 $x_r-x_l$을 disparity라고 하고, $D = x_r-x_l$이라고 한다.

Essential Matrix

회전변환은 없으므로(두 평면이 평행하므로) rotation matrix $R = I$이고, translation matrix $T = [-d, 0, 0]^T$가 된다. 그리고 $E = [T_\times]R = \left(\begin{matrix}0 & 0 & 0 \ 0 & 0 & d \ 0 & -d & 0\end{matrix}\right)$이다. $p_l = [x, y, f], p’ = [x’, y’, f]$라고 하면 $p’^TEp=0$을 이용하여

임을 알 수 있다. 이는 카메라가 평행이동하여 찍은 두 사진에서, 같은 점은 같은 $y$축 좌표가 같아야 함을 알려준다.

Sum of Square Difference (SSD)

왼쪽 사진에서 한 픽셀에 대하여 오른쪽 사진에는 epipolar line이 있을 것이다. 그 epipolar line 위에 있는 모든 픽셀에 대해서, 왼쪽 사진 픽셀과의 차이를 제곱해서 모두 더한다. 그 cost가 가장 작은 것이 best match이다. 그러나 이 방법은 비슷한 패턴들이 많이 나타날 때에는 best match가 많이 나타날 수도 있다.

따라서, ratio distance를 정의한다.

$f_2$는 $f_1$과의 best match이고, $f_2’$는 두 번째 best match이다. 근데 이게 그냥 SSD보다 왜 좋은걸까?

Normalized Cross Correlation (NCC)

SSD와 비슷한데, 점끼리의 차가 아닌 region의 차의 제곱을 계산한다. 중앙에 해당 픽셀이 있고, 그 주위 픽셀까지 정사각형으로 묶는다. 그 두 사각형이 $A$와 $B$라고 하면, 이들을 $a$, $b$라는 벡터로 만든다.

$A$는 고정해 놓고, $B$를 움직이면서 NCC cost를 계산한다. 이 cost가 가장 작은 점이 best match이다. 이 때, window size가 너무 작으면 노이즈까지 전부 세세하게 고려하게 되고, 너무 크면 디테일이 사라지게 되어 적당한 window size를 고르는 것이 중요하다.

Stereo Matching Framework

  1. 모든 차이에 대해서 raw matching cost를 계산한다. ($E_0(x,y;d)=\rho(I_L(x’+d,y’)-I_R(x’,y’))$) 이때 $\rho$는 robust function인데, input $u$가 작으면 제곱에 가까운 값을, 크면 1에 수렴하는 값을 내놓는다. ($\rho(u;\sigma) = \frac{u^2}{\sigma^2+u^2}$) 폐쇄된 부분(occlusion)이나 튀는 값 때문에 이 함수를 쓴다?

  2. cost를 공간적으로 합친다? ($E(x,y;d)=\sum_{(x’,y’)\in N(x,y)}E_0(x’,y’,d)$)

  3. 각각의 픽셀에 대해 winning disparity를 찾는다. ($d(x,y)=argmin_d(x,y;d)$)

  4. sub-pixel accuracy로 보간한다.

Baseline은 너무 작으면 depth를 계산하는 데에 에러가 있을 수 있고, 너무 크면 같은 점 찾기가 어려워진다. 전통적인 Stereo Matching은 디테일한 표면 예측을 하고, 빠른 계산을 할 수 있다는 장점이 있다. 그러나 Baseline이 작으면 노이즈가 많을 수 있고, 질감에 따라 결과가 다르다는 점, 가까운 폐쇄 경계를 찾을 때 어렵다는 단점이 있다?

Data Interpolation

sparse한 3D 점들이 있을 때 이것을 보간하는 방법에는 여러가지가 있는데, 먼저 energy minimization은 에너지의 최소점을 찾는 것이다.

각 항을 미분하면

이고, 우리는 $E_{total}(d)$를 줄이는 것이 목표이기 때문에

으로 만들어 주는 방향으로 가면 된다.

이렇게 iteration을 돌려주면 된다. 이걸 dynamic programming으로 푸는 방법이 있다. 먼저 가장 쉬운 1차원 cost function을 살펴본다. 우선 아까와는 다르게 로 정의한다.

2D에는 이를 적용할 수 없다. ($d_{x,y-1}$과 $d_{x-1,y}$가 서로 다른 $d_{x-1,y-1}$값에 의해 결정되기 때문) 그래서 Graph cuts optimization 이라는 알고리즘을 사용한다.

그래서 그래프컷을 어떻게 사용함?


Terms

disparity : 차이, 이격도
occlusion : 폐쇄
specularity : 반사
sweep : 쓸다