Python과 OpenCV – 46 : 스트레오 이미지로부터 깊이 맵(Depth Map) 생성하기

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_depthmap/py_depthmap.html 입니다.

이전 글에서는, Epipolar 제약조건과 이와 관련된 용어들에 대한 기본 개념을 살펴 보았습니다. 동일한 장념에 대한 2개의 이미지를 가지고 있다면, 이를 이용해 직감적으로 깊이에 대한 정보를 얻을 수 있다는 것을 알 수 있습니다. 아래의 이미지는 이런 직관을 간단한 수학적인 수식으로 나타내고 있습니다.

위의 그림에 비례하는 삼각형들이 있습니다. 비례하는 삼각형들간의 관계를 통해 다음 공식을 얻을 수 있습니다. (disparity = 차이)

x와 x’는 장면 3D 포인트(X)가 이미지 평면에 표시되는 위치와 이를 촬영한 카메라의 중심 사이의 거리입니다. B는 두 카메라 사이의 거리이며 f는 카메라의 초점거리입니다. B와 f는 이미 알고 있는 값입니다. 위의 공식은 장면에서 포인트의 깊이는 이미지 포인트와 이를 촬영한 카메라 중심 사이의 거리 차이에 반비례한다는 것을 나타냅니다. 이러한 정보를 통해, 이미지에서 모든 픽셀의 깊이를 얻을 수 있습니다.

이에 대한 OpenCV에 대한 예제를 살펴 보면 다음과 같습니다.

tsukuba_l.png 파일과 tsukuba_r.png는 각각 동일한 장면에 대해 왼쪽과 오른쪽 방향에서 촬영한 이미지로 각각 아래와 같습니다.

위의 코드를 실행하면 그 결과는 다음과 같습니다.

카메라로부터 가까운 픽셀은 밝고, 멀어질 수록 어둡게 표시됩니다. 결과 이미지에는 잘못된 잡음이 섞여 있는데, 이를 조정하기 위해 numDisparities와 blockSize 값을 조정해 개선할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다