Stereo Vision System for Depth estimation
1. Stereo Vision
수평 정렬된 스테레오 카메라 시스템에서 획득한 **좌, 우 2개의 영상 픽셀 시차(disparity)**의 **정도(scale)**을 이용해 깊이(depth)를 추정하는 문제
- 위 그림에서 카메라 사이의 픽셀간 시차(disparity), 카메라간 거리(baseline), 카메라 초점거리(focal length) 를 알고 있다면, 삼각형 닮음비를 이용해 거리(depth)를 구할 수 있음
- 두 이미지는 동시에 수집되었다는 가정(synchronized)
- 두 이미지평면이 완벽한 수평을 이루고 있다는 가정 (실제 스테레오 카메라는 완벽히 정렬되어 있지 않으므로 에피폴라 기하학에 의거한 스테레오 카메라 수평정렬(rectification) 과정이 필요함
2. 깊이맵(Depth map) 생성 과정
2.1. 스테레오 카메라 준비
- 두 카메라가 수평으로 구성되어 동시에 영상을 획득할 수 있는 스테레오 카메라
2.2. 스테레오 카메라 캘리브레이션 (Stereo Calibration)
- 여러장의 체스보드 패턴을 이용해 각 카메라의 캘리브레이션을 통해 각 카메라의 내부파라미터(intrinsic)를 구함
- 스테레오 캘리브레이션을 통해 두 카메라의 외부파라미터(extrinsic)를 구함
- 각 카메라의 내부파라미터에는 카메라의 초점거리(f)와 왜곡정보(dist)가 있고, 외부파라미터는 두 카메라의 위치 관계(R|t)가 포함됨
- 재투영 에러(re-projection error) 값을 통해 최적의 캘리브레이션 결과를 도출함
2.3. 스테레오 정렬 (Stereo Rectification)
- 스테레오 카메라 캘리브레이션을 통해 구한 두 카메라의 위치관계(R|t)를 이용해 두 영상을 수평 정렬하는 과정(왜곡보정 포함)
- 에피폴라 기하학 기반 에피폴 라인을 수평으로 가도록 최적화하는 과정
2.4. 스테레오 매칭 (Stereo Matching)
- 스테레오 정렬을 통해 정렬된 두 이미지에서 각 픽셀의 시차(disparity)를 구하는 과정
- 대표적인 Block Matching 방법으로 SAD, SSD 등
- 정렬된 이미지에서 왼쪽이미지에 임의의 픽셀(P)은 오른쪽이미지의 수평 왼쪽 방향에 위치할 것이라는 가정하에 오른쪽이미지에서 블록 서칭을 통해 가장 일치하는 픽셀(P’)을 찾고 P - P’ 을 disparity라 함
- 모든 픽셀에 대한 disparity를 이미지로 표현하면 disparity map이됨
3. 결과 및 응용
3.1. 시차맵 (Disparity Map)
- Stereo SGBM 매칭 알고리즘 사용 (약 10 FPS)
3.2. 컬러맵
- cv.COLORMAP_JET
3.3. WLS 필터링
- Stereo SGBM + WLS (약 5 FPS)
3.4. 응용
- 40cm 내 물체 감지
팁
opencv stereoBM matcher 파라미터
- Oepncv에서 제공하는 기본 Blcok Matching 알고리즘(SAD 알고리즘 사용)
- 파라미터 설명
참고
- Stereo Camera Depth Estimation With OpenCV (Python/C++)
- Making A Low-Cost Stereo Camera Using OpenCV | LearnOpenCV #
- 双目三维重建系统(双目标定+立体校正+双目测距+点云显示)Python-CSDN博客
- [MVG] Stereo Camera Calibration 예제코드 및 설명 (C++)
- Stereo Calibration WLS
- How do you use OpenCV’s DisparityWLSFilter in Python? - Stack Overflow
- Stereo Camera Depth Estimation With OpenCV (Python/C++)