StereoBM은 Stereo 카메라의 두 이미지에 대해 block matching을 통해 disparity map을 찾는 방법이고 StereoSGBM은 StereoBM의 개선 버전이다.
두 방법 모두 Stereo 이미지가 rectified (두 이미지의 행 또는 열이 정렬된 상태)일 것을 가정하므로, StereoBM과 StereoSGBM을 수행하려면 그 전에 두 이미지에 대한 rectify를 수행해야 한다. 이미지가 rectified 된 상태라면 기준 이미지(일반적으로 왼쪽 카메라)를 이용하여 대상 이미지(일반적으로 오른쪽 카메라)의 동일한 행(y 좌표)에 대해서만 매칭 검색을 수행할 수 있다.
StereoBM 계열의 방법들은 모두 별도의 특징점을 추출하지 않고 픽셀값만 사용하여 매칭을 수행한다.
StereoBM
StereoBM은 block 단위로 매칭 포인트를 찾는 방법이다. (그래서 이름이 block matching이다.) 우선 각 픽셀 를 중심으로 두 이미지에서 크기의 블록을 설정한다. 예컨대 이면 개의 픽셀에 대해 비교를 수행한다.
기준 이미지의 블록에 대해 동일한 행의 대상 이미지의 블록에 대해 다음의 절대값 오차(Sum of Absolute Difference)를 계산한다.
여기서 의 블록의 반경에 해당하고, 는 사용자가 정의하는(예: 16, 64 등) disparity 값이다.
알고리즘은 해당 disparity 값 내에서 모든 disparity 값을 시도한다. 예컨대 사용자가 disparity 값을 64로 설정하면 알고리즘은 disparity 값을 0에서 63까지 변경하면서 비용함수를 계산한다.
위의 식은 각 픽셀 별로 대응하는 픽셀 값과의 절대값 차이를 구한 후 block 내 모든 값을 합산하는 것을 의미한다. 이렇게 구한 값 중에 disparity 값을 최소화하는 값을 찾으면 최적 disparity 값이 된다.
이렇게 픽셀별로 구한 최적 disparity 값에 대해 인 값을 이용하여 focal length와 baseline과 다음과 같이 계산하면 최종적으로 depth map을 구할 수 있다.
StereoSGBM
StereoSGBM은 SAD(Sum of Absolute Difference) 대신 Census Transform이나 Hamming Distance 같은 비용함수를 사용하고, 여러 방향에서 정보를 집계하여 보다 일관성있는 시차값을 계산한다. StereoSGBM이 StereoBM에 비해 더 많은 계산을 사용하므로 결과 품질이 더 좋지만 더 비싸다.
예컨대 Census Transform을 사용한 비용함수는 다음과 같이 정의된다. (아래는 예시일 뿐, 다른 거리 함수를 사용하는 것도 가능하다)
여기서 는 Census Transform
StereoSGBM은 이러한 비용함수를 이용하여 다음과 같이 8방향에서 대해 비용을 집계한다.
여기서 는 방향 에서의 누적 비용이고, 는 smoothing 파라미터이다.
8방향에서 집계된 비용을 합산하여 최종 비용을 계산한다.
StereoBM과 같이 최소 비용을 가지는 시차값을 선택하여 disparity map을 구성한다.