ABOUT ME

공부해온 내용들을 정리하는 곳

Today
Yesterday
Total
  • [OpenCV] Depth Map from Stereo Images
    Image Geometry 2018. 2. 1. 18:57

    스테레오 이미지로부터 깊이 맵


    목표

    스테레오 이미지에서 깊이맵을 만드는 방법을 배웁니다.


    기본이론

    지난 세션에서, 에피폴라제약과 그 외 다른 항목과 같은 기본 개념을 보았습니다. 또한 동일한 장면의 두 개 이미지가 있을 때, 직관적인 방법으로 깊이 정보를 얻을 수 있음을 보았습니다. 아래는 직관을 증명하는 간단한 수학 공식과 이미지 입니다.



    위의 다이어그램은 등가 삼각형(equivalent triangles)을 포함합니다. 등가 방정식(equivalent equations)은 아래의 결과를 산출합니다.




    x 와  x' 은 장면 포인트 3D와 그들의 그들의 카메라 중심에 대응하는 이미지 평면 내 포인트 사이의 거리입니다.

    B는 두 카메라 사이의 거리(우리가 알고있는)이고 f는 카메라의 초점거리(이미 알고 있는).

    요약하면, 위의 방정식은 장면 내 포인트의 깊이는 

    대응하는 이미지 포인트와 그들의 카메라 중심의 거리 차에 반비례합니다.


    이 정보를 사용하면 우리는 이미지의 모든 픽셀의 깊이를 도출할 수 있습니다.

    따라서 그것은 두 이미지 사이의 대응하는 매치를 찾습니다.

    우리는 에피라인 제약이 어떻게 이 작업을 빠르고 정ㅎ확하게 수행하는지 보았습니다.

    일단 매치들을 발견하면, 그것은 변위를 찾습니다. 이제 OpenCV로 어떻게 수행하는지 살펴봅시다.


    코드

    아래의 코드 조각은 변위맵을 만드는 단순한 절차를 보여줍니다.


    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    imgL = cv2.imread('tsukuba_l.png',0)
    imgR = cv2.imread('tsukuba_r.png',0)
    
    stereo = cv2.createStereoBM(numDisparities=16, blockSize=15)
    disparity = stereo.compute(imgL,imgR)
    plt.imshow(disparity,'gray')
    plt.show()


    아래의 이미지는 원본 이미지(좌)와 그 변위 맵(우)를 포함합니다. 그림에서 보이듯이, 결과는 높은 수준의 노이즈로 더럽혀 있습니다. numDisparities와 blockSize의 값을 조절하여 더 나은 결과를 얻을 수 있습니다.





    Reference

    [1] https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_calib3d/py_depthmap/py_depthmap.html#py-depthmap



Designed by Tistory.