Beispiel #1
0
 def __init__(self, min_disparity=16, num_disp=96, sad_window_size=3,
              uniqueness=10, speckle_window_size=100, speckle_range=32,
              p1=216, p2=864, max_disparity=1, full_dp=False,
              settings=None):
     """Instantiate private variables and call superclass initializer."""
     #: Minimum number of disparities. Normally 0, can be adjusted as
     #: needed
     self._min_disparity = min_disparity
     #: Number of disparities
     self._num_disp = num_disp
     #: Matched block size
     self._sad_window_size = sad_window_size
     #: Uniqueness ratio for found matches
     self._uniqueness = uniqueness
     #: Maximum size of smooth disparity regions to invalid by noise
     self._speckle_window_size = speckle_window_size
     #: Maximum disparity range within connected component
     self._speckle_range = speckle_range
     #: Penalty on disparity change by +-1 between neighbor pixels
     self._P1 = p1
     #: Penalty on disparity change by multiple neighbor pixels
     self._P2 = p2
     #: Maximum left-right disparity. 0 to disable check
     self._max_disparity = max_disparity
     #: Boolean to use full-scale two-pass dynamic algorithm
     self._full_dp = full_dp
     #: StereoSGBM whose state is controlled
     self._block_matcher = cv2.StereoSGBM()
     super(StereoSGBM, self).__init__(settings)
Beispiel #2
0
def main():
    # 左右画像をグレースケールで取得
    gray_l = cv2.imread("left.png",0)
    gray_r = cv2.imread("right.png",0)
    # 画像のヒストグラム平坦化・平滑化
    gray_l = cv2.GaussianBlur( cv2.equalizeHist(gray_l),(5,5), 0)
    gray_r = cv2.GaussianBlur( cv2.equalizeHist(gray_r),(5,5), 0)
    # セミグローバルブロックマッチング
    window_size = 7
    stereo = cv2.StereoSGBM(
        minDisparity = 0,           # 視差の下限
        numDisparities = 64,        # 最大の上限
        SADWindowSize = window_size,# SADの窓サイズ
        uniquenessRatio = 10,       # パーセント単位で表現されるマージン
        speckleWindowSize = 0,      # 視差領域の最大サイズ
        speckleRange = 16,          # それぞれの連結成分における最大視差値
        disp12MaxDiff = 0,          # left-right 視差チェックにおけて許容される最大の差
        P1 = 8*3*window_size**2,    # 視差のなめらかさを制御するパラメータ1
        P2 = 32*3*window_size**2,   # 視差のなめらかさを制御するパラメータ2
        fullDP = False              # 完全な2パス動的計画法を使うならTrue
    )

    # 視差を求める
    disp = stereo.compute(gray_l, gray_r)
    # 視差データを8bitデータに変換(imshowで表示させるため)
    disp = cv2.normalize(disp, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    cv2.imshow("disp",disp)                 # 視差画像の表示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
Beispiel #3
0
    def DistanceMeasure(self,x,y):
            # 根据更正map对图片进行重构
            img1_rectified = cv2.remap(self.left_image, camera_configs.left_map1, camera_configs.left_map2, cv2.INTER_LINEAR)
            img2_rectified = cv2.remap(self.right_image, camera_configs.right_map1, camera_configs.right_map2, cv2.INTER_LINEAR)

            # 将图片置为灰度图,为StereoBM作准备
            imgL = cv2.cvtColor(img1_rectified, cv2.COLOR_BGR2GRAY)
            imgR = cv2.cvtColor(img2_rectified, cv2.COLOR_BGR2GRAY)

            # 两个trackbar用来调节不同的参数查看效果
            num = cv2.getTrackbarPos("num", "depth")
            blockSize = cv2.getTrackbarPos("blockSize", "depth")
            if blockSize % 2 == 0:
                blockSize += 1
            if blockSize < 5:
                blockSize = 5

            # 根据Block Maching方法生成差异图(opencv里也提供了SGBM/Semi-Global Block Matching算法,有兴趣可以试试)
            stereo = cv2.StereoSGBM(minDisparity = 16,numDisparities = 128,SADWindowSize = 3,uniquenessRatio = 10,
                          speckleWindowSize = 100,speckleRange = 16,disp12MaxDiff = -1,P1 = 8*3*3**2,P2 = 32*3*3**2,fullDP = False)
            disparity = stereo.compute(imgL, imgR)
            disp = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
            # 将图片扩展至3d空间中,其z方向的值则为当前的距离
            threeD = cv2.reprojectImageTo3D(disparity.astype(np.float32) / 16., camera_configs.Q)
            return threeD[x][y]
Beispiel #4
0
def main():
  leftdir = sys.argv[1]
  rightdir = sys.argv[2]
  for i in range(500):
      print("{:04d}".format(i))
      leftimg = cv2.imread(leftdir + "000000" +"{:04d}".format(i) + ".png")
      rightimg = cv2.imread(rightdir + "000000" +"{:04d}".format(i) + ".png")
      bl = 0.537
      focal = 718.856
      height, width, chan = leftimg.shape
      gray0 = cv2.cvtColor(leftimg, cv2.COLOR_BGR2GRAY)
      gray1 = cv2.cvtColor(rightimg, cv2.COLOR_BGR2GRAY)
      window_size = 9#3 #5
      min_disp = 0#48 #32
      num_disp = 320-min_disp
      stereo = cv2.StereoSGBM(minDisparity = min_disp,
            numDisparities = 192,#num_disp,
            SADWindowSize = window_size,
            uniquenessRatio = 5,#10,
            speckleWindowSize = 100,
            speckleRange = 32,
            disp12MaxDiff = 1,
            P1 = 8*3*window_size**2,
            P2 = 32*3*window_size**2,
            fullDP = 1)#False)
      disp = stereo.compute(gray0, gray1).astype(np.float32) / 16.0
      writePFM(sys.argv[3] + "000000" + "{:04d}".format(i) + ".pfm", disp)
Beispiel #5
0
def disparity_map(image_left, image_right):
    """Compute the disparity images for image_left and image_right.

    Arguments:
      image_left, image_right: rectified stereo image pair.

    Returns:
      an single-channel image containing disparities in pixels,
        with respect to image_left's input pixels.
    """

    sbm = cv2.StereoSGBM()
    sbm.SADWindowSize = 3
    sbm.numberOfDisparities = 256
    sbm.preFilterCap = 16
    sbm.minDisparity = 2
    sbm.uniquenessRatio = 10
    sbm.speckleWindowSize = 150
    sbm.speckleRange = 1
    sbm.disp12MaxDiff = 1
    sbm.fullDP = True
    sbm.P1 = 8 * image_left.shape[2] * (sbm.SADWindowSize**2)
    sbm.P2 = 32 * image_left.shape[2] * (sbm.SADWindowSize**2)

    disparity = sbm.compute(image_left, image_right)

    disparity_visual = cv2.normalize(disparity,
                                     alpha=0,
                                     beta=255,
                                     norm_type=cv2.cv.CV_MINMAX,
                                     dtype=cv2.cv.CV_8U)

    return disparity_visual
def disparity_map(image_left, image_right):
    """
    Compute the disparity images for image_left and image_right.

    Arguments:
      image_left, image_right: rectified stereo image pair.

    Returns:
      an single-channel image containing disparities in pixels,
        with respect to image_left's input pixels.
    """
    # Set up the disparity calculator
    stereo = cv2.StereoSGBM(minDisparity=20,
                            numDisparities=512,
                            SADWindowSize=7,
                            uniquenessRatio=5,
                            speckleWindowSize=100,
                            speckleRange=5,
                            disp12MaxDiff=1,
                            P1=8 * 3 * 7**2,
                            P2=32 * 3 * 7**2,
                            fullDP=False)

    # Calculate disparity
    disparity = stereo.compute(image_left, image_right).astype(
        np.float32) / 16.0

    # Convert the disparity image into a single channel image
    disparity = np.uint8(disparity)
    return disparity
    def process(self):
        if self.image == None or self.left_image == None or self.right_image == None:
            return

        # disparity settings
        window_size = 1
        min_disp = 32
        num_disp = 112 - min_disp
        stereo = cv2.StereoSGBM(minDisparity=min_disp,
                                numDisparities=num_disp,
                                SADWindowSize=window_size,
                                uniquenessRatio=10,
                                speckleWindowSize=100,
                                speckleRange=32,
                                disp12MaxDiff=1,
                                P1=8 * 3 * window_size**2,
                                P2=32 * 3 * window_size**2,
                                fullDP=False)

        disparity = stereo.compute(self.left_image,
                                   self.right_image).astype(np.float32)
        disparity = (disparity - min_disp) / num_disp
        cv2.imshow('left', self.left_image)
        cv2.imshow('right', self.right_image)
        cv2.imshow('disparity', disparity)
        self.image = None
        self.left_image = None
        self.right_image = None
Beispiel #8
0
    def getDepth(self, image, image2):
          
        grayScaleFullImage = cv.CreateImage((image.width, image.height), 8, 1)
        cv.CvtColor(image, grayScaleFullImage, cv.CV_BGR2GRAY)
        
        grayScaleFullImage2 = cv.CreateImage((image2.width, image2.height), 8, 1)
        cv.CvtColor(image2, grayScaleFullImage2, cv.CV_BGR2GRAY)
           
        [mat_w, mat_h] = self.size
        
        r = cv.CreateMat(mat_h, mat_w, cv.CV_8UC1)
        r2 = cv.CreateMat(mat_h, mat_w, cv.CV_8UC1)
        print type(r)
        print type(image)
        print type(self.map1x)
        print cv.GetSize(r)
        print cv.GetSize(self.map1x)
        cv.Remap(grayScaleFullImage, r, self.map1x, self.map1y)
        cv.Remap(grayScaleFullImage2, r2, self.map2x, self.map2y)
        
        cv.ShowImage("win3", r)
        cv.ShowImage("win4", r2)
        
        
        #stereo_match that comes in opencv
        
        # disparity range is tuned for 'aloe' image pair
        window_size = 3
        min_disp = 16
        num_disp = 112 - min_disp
        stereo = cv2.StereoSGBM(minDisparity=min_disp,
            numDisparities=num_disp,
            SADWindowSize=window_size,
            uniquenessRatio=10,
            speckleWindowSize=100,
            speckleRange=32,
            disp12MaxDiff=1,
            P1=8 * 3 * window_size ** 2,
            P2=32 * 3 * window_size ** 2,
            fullDP=False
        )
    
        print 'computing disparity...'
        disp = stereo.compute(np.asarray(r), np.asarray(r2)).astype(np.float32) / 16.0
    
        print 'generating 3d point cloud...'
        points = cv2.reprojectImageTo3D(disp, np.asarray(self.Q))
        
        
        colors = cv2.cvtColor(np.asarray(r), cv2.COLOR_GRAY2RGB)
        mask = disp > disp.min()
        out_points = points[mask]
        out_colors = colors[mask]
        # Resulting .ply file cam be easily viewed using MeshLab ( http://meshlab.sourceforge.net
        out_fn = 'out.ply'
        write_ply('out.ply', out_points, out_colors)
        print '%s saved' % 'out.ply'
    

        cv2.imshow('disparity', (disp - min_disp) / num_disp)
Beispiel #9
0
 def do_disparity(self):
     if not (self.lframe is None or self.rframe is None):
         window_size = 3
         min_disp = 16
         num_disp = 112 - min_disp
         stereo = cv2.StereoSGBM(minDisparity=min_disp,
                                 numDisparities=num_disp,
                                 SADWindowSize=window_size,
                                 uniquenessRatio=10,
                                 speckleWindowSize=100,
                                 speckleRange=32,
                                 disp12MaxDiff=1,
                                 P1=8 * 3 * window_size**2,
                                 P2=32 * 3 * window_size**2,
                                 fullDP=False)
         disp = stereo.compute(self.lframe, self.rframe).astype(
             np.float32) / 16.0
         dbprint('generating 3d point cloud...')
         h, w = self.lframe.shape[:2]
         f = 0.8 * w  # guess for focal length
         Q = np.float32([
             [1, 0, 0, -0.5 * w],
             [0, -1, 0, 0.5 * h],  # turn points 180 deg around x-axis,
             [0, 0, 0, -f],  # so that y-axis looks up
             [0, 0, 1, 0]
         ])
         points = cv2.reprojectImageTo3D(disp, Q)
         colors = cv2.cvtColor(self.lframe, cv2.COLOR_BGR2RGB)
         mask = disp > disp.min()
         self.verts = points[mask]
         self.colors = colors[mask]
         self.disparity = (disp - min_disp) / num_disp
Beispiel #10
0
    def semiGlobalBlockMatch(self):
        """
        A typical correspondence algorithm consists of following three stages:

        Pre-filtering to normalize the image brightness and enhance texture
        Matching points along horizontal lines in local windows
        Post-filtering to eliminate bad matches
        """
        SADWindowSize = 3

        stereo = cv2.StereoSGBM()

        stereo.minDisparity = 0
        stereo.numberOfDisparities = self.ndisparities  # 96
        stereo.SADWindowSize = SADWindowSize  # 13
        stereo.disp12MaxDiff = 1  # -1
        stereo.speckleWindowSize = 100  # 0  # 350
        stereo.speckleRange = 32  # 2
        stereo.P1 = SADWindowSize * SADWindowSize * 8  # 4 * numChannel * SADWindowSize * SADWindowSize
        stereo.P2 = SADWindowSize * SADWindowSize * 32  # 32 * numChannel * SADWindowSize * SADWindowSize
        stereo.uniquenessRatio = 10
        stereo.preFilterCap = 63
        stereo.fullDP = True

        disparity = stereo.compute(self.grayL, self.grayR) / 16.
        disparity = disparity - np.amin(disparity)

        return disparity
Beispiel #11
0
def disparity_map(image_left, image_right):
    """Compute the disparity images for image_left and image_right.

    Arguments:
      image_left, image_right: rectified stereo image pair.

    Returns:
      an single-channel image containing disparities in pixels,
        with respect to image_left's input pixels.
    """
    grayleft = cv2.cvtColor(image_left, cv2.COLOR_BGR2GRAY)
    grayright = cv2.cvtColor(image_right, cv2.COLOR_BGR2GRAY)
    c, r = grayleft.shape
    #  grayleft = cv2.cv.fromarray(grayleft)
    #  grayright = cv2.cv.fromarray(grayright)
    s = cv2.StereoSGBM()
    s.SADWindowSize = 11
    s.preFilterCap = 10
    s.minDisparity = 5
    s.numberOfDisparities = 14 * 16
    s.disp12MaxDiff = 1
    s.fullDP = False
    s.P1 = 8 * 3 * s.SADWindowSize * s.SADWindowSize
    s.P2 = 32 * 3 * s.SADWindowSize * s.SADWindowSize
    s.uniquenessRatio = 12
    disparity = s.compute(grayleft, grayright)
    #  cv2.cv.FindStereoCorrespondenceBM(grayleft, grayright, disparity, sbm)
    disparity_visual = cv2.cv.CreateMat(c, r, cv2.cv.CV_8U)
    cv2.cv.Normalize(cv2.cv.fromarray(disparity), disparity_visual, 0, 255,
                     cv2.cv.CV_MINMAX)
    disparity_visual = np.array(disparity_visual)
    #  cv2.imshow("f", disparity_visual)
    return disparity_visual
Beispiel #12
0
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.imgL = ImageTk.PhotoImage(Image.open("small.png"))
        self.imgR = ImageTk.PhotoImage(Image.open("small2.png"))
        self.rawL = self.imgL
        self.rawR = self.imgR
        self.cvImgR = ""
        self.cvImgL = ""
        self.showRaw = True
        self.showEdge = False
        self.showDisp = False

        self.Q = cv.Load("Q.xml")
        self.mx1 = np.asarray(cv.Load("mx1.xml"))
        self.my1 = np.asarray(cv.Load("my1.xml"))
        self.mx2 = np.asarray(cv.Load("mx2.xml"))
        self.my2 = np.asarray(cv.Load("my2.xml"))

        self.stereo = cv2.StereoSGBM()
        self.stereo.SADWindowSize = 9
        self.stereo.numberOfDisparities = 96
        self.stereo.preFilterCap = 63
        self.stereo.minDisparity = -21
        self.stereo.uniquenessRatio = 7
        self.stereo.speckleWindowSize = 0
        self.stereo.speckleRange = 8
        self.stereo.disp12MaxDiff = 1
        self.stereo.fullDP = False

        #holder varriables for the sliders
        self.SADWindowSizeScale = 9
        self.numberOfDisparitiesScale = 96
        self.preFilterCapScale = 63
        self.minDisparityScale = -21
        self.uniquenessRatioScale = 7
        self.speckleWindowSizeScale = 0
        self.speckleRangeScale = 8
        self.disp12MaxDiffScale = 1
        self.fullDP = False

        self.createWidgets()

        self.SADWindowSizeSlider.set(self.stereo.SADWindowSize)
        self.numberOfDisparitiesSlider.set(self.stereo.numberOfDisparities)
        self.preFilterCapSlider.set(self.stereo.preFilterCap)
        self.minDisparitySlider.set(self.stereo.minDisparity)
        self.uniquenessRatioSlider.set(self.stereo.uniquenessRatio)
        self.speckleWindowSizeSlider.set(self.stereo.speckleWindowSize)
        self.speckleRangeSlider.set(self.stereo.speckleRange)
        self.disp12MaxDiffSlider.set(self.stereo.disp12MaxDiff)

        self.bind("<Up>", self.arwU)
        self.bind("<Down>", self.arwD)
        self.bind("<Left>", self.arwL)
        self.bind("<Right>", self.arwR)
        self.bind("<Button-1>", self.mouseCallback)
        self.bind("<Key>", self.keyCallback)
        self.after(500, self.updateCamera)
Beispiel #13
0
    def __init__(self, params=default_params):
        self.params = params

        # Initilize stereo semi-global block matching
        self.sgbm = cv2.StereoSGBM(**self.params)

        # Re-map process
        self.process = self.compute
Beispiel #14
0
 def __init__(self, is_sgbm=False):
     # fixed parameters for current camera
     # StereoSGBM([minDisparity, numDisparities, SADWindowSize[, P1[, P2[, disp12MaxDiff[, preFilterCap[, uniquenessRatio[, speckleWindowSize[, speckleRange[, fullDP]]]]]]]]]) -> <StereoSGBM object>
     if is_sgbm:
         self.bm = cv2.StereoSGBM(0, 128, 15, 200, 400, 0, 9, 15, 100, 4,
                                  False)
     else:
         self.bm = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET, 128,
                                45)  #preset, ndisp, SADWindowSize
     self.is_sgbm = is_sgbm
Beispiel #15
0
    def calc(self):
        img_left = cv2.pyrDown(cv2.imread(path.join(FOLDER, 'aloeL.jpg')))
        img_right = cv2.pyrDown(cv2.imread(path.join(FOLDER, 'aloeR.jpg')))

        img_left = cv2.cvtColor(img_left, cv2.COLOR_BGR2RGB)
        img_right = cv2.cvtColor(img_right, cv2.COLOR_BGR2RGB)

        stereo_parameters = dict(
            SADWindowSize=5,
            numDisparities=192,
            preFilterCap=4,
            minDisparity=-24,
            uniquenessRatio=1,
            speckleWindowSize=150,
            speckleRange=2,
            disp12MaxDiff=10,
            fullDP=False,
            P1=600,
            P2=2400)

        stereo = cv2.StereoSGBM(**stereo_parameters)
        disparity = stereo.compute(img_left, img_right).astype(np.float32) / 16

        h, w = img_left.shape[:2]
        ygrid, xgrid = np.mgrid[:h, :w]
        ygrid = ygrid.astype(np.float32)
        xgrid = xgrid.astype(np.float32)

        Bf = w * 0.8
        x = (xgrid - w * 0.5)
        y = (ygrid - h * 0.5)
        d = (disparity + 1e-6)
        z = (Bf / d).ravel()
        x = (x / d).ravel()
        y = -(y / d).ravel()

        mask = (z > 0) & (z < 30)
        points = np.c_[x, y, z][mask]
        colors = img_left.reshape(-1, 3)[mask]

        poly = tvtk.PolyData()
        poly.points = points
        poly.verts = np.arange(len(points)).reshape(-1, 1)
        poly.point_data.scalars = colors.astype(np.uint8)
        mapper = tvtk.PolyDataMapper()
        mapper.set_input_data(poly)
        actor = tvtk.Actor(mapper=mapper)
        self.scene.add_actor(actor)
        self.scene.camera.position = (0, 20, -60)
        self.scene.camera.view_up = 0, 1, 0
        self.scene.render()

        self.axes.clear()
        self.axes.imshow(disparity)
        self.figure.canvas.draw()
Beispiel #16
0
 def replace_bm(self):
     """Replace ``block_matcher`` with current values."""
     self.block_matcher = cv2.StereoSGBM(minDisparity=self._min_disparity,
                     numDisparities=self._num_disp,
                     SADWindowSize=self._sad_window_size,
                     uniquenessRatio=self._uniqueness,
                     speckleWindowSize=self._speckle_window_size,
                     speckleRange=self._speckle_range,
                     disp12MaxDiff=self._max_disparity,
                     P1=self._P1,
                     P2=self._P2,
                     fullDP=self._full_dp)
Beispiel #17
0
def testStereoAlgo(I0, I1, winSize, numDisp):
    '''
        Fonction calculant et affichant la carte de disparité avec 4 algorighmes:
        BM : algorithme de bloque matching stereo simple
        SGBM1 : algorithme sgbm avec une faible régularisaion
        SGBM2 : algorithme sgbm avec une régularisation moyenne
        SGMB3 : algorithme sgbm avec une forte régularisation

        winSize = taille de la fenêtre de corrélation
        numDisp = nombre d'hypothèse de disparités
    '''
    print(numDisp)
    bm = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET, numDisp, winSize)
    disp1 = bm.compute(I0, I1).astype(np.float32) / 16.
    sgbm = cv2.StereoSGBM(0, numDisp, winSize, P1=0, P2=5)
    disp2 = sgbm.compute(I0, I1).astype(np.float32) / 16.
    sgbm2 = cv2.StereoSGBM(0,
                           numDisp,
                           winSize,
                           P1=10,
                           P2=500,
                           speckleWindowSize=51,
                           speckleRange=1)
    disp3 = sgbm2.compute(I0, I1).astype(np.float32) / 16.
    sgbm3 = cv2.StereoSGBM(0,
                           numDisp,
                           winSize,
                           P1=5000,
                           P2=10000,
                           speckleWindowSize=51,
                           speckleRange=1)
    disp4 = sgbm3.compute(I0, I1).astype(np.float32) / 16.
    figure()
    disp = np.concatenate(
        [np.concatenate([disp1, disp3]),
         np.concatenate([disp2, disp4])],
        axis=1)
    imshow(disp, vmin=0, vmax=numDisp)
    colorbar()
    title('resultat [[BM ,SGBM1],[SGBM 2, SGBM3]]')
def getDisparity(imgLeft, imgRight, method="BM"):
    gray_left = cv2.cvtColor(imgLeft, cv.CV_BGR2GRAY)
    gray_right = cv2.cvtColor(imgRight, cv.CV_BGR2GRAY)
    print gray_left.shape
    c, r = gray_left.shape
    if method == "BM":
        sbm = cv.CreateStereoBMState()
        disparity = cv.CreateMat(c, r, cv.CV_32F)
        sbm.SADWindowSize = 5
        sbm.preFilterType = 1
        sbm.preFilterSize = 5
        sbm.preFilterCap = 30
        sbm.minDisparity = 0
        sbm.numberOfDisparities = 16
        sbm.textureThreshold = 0
        sbm.uniquenessRatio = 0
        sbm.speckleRange = 2
        sbm.speckleWindowSize = 100

        gray_left = cv.fromarray(gray_left)
        gray_right = cv.fromarray(gray_right)

        cv.FindStereoCorrespondenceBM(gray_left, gray_right, disparity, sbm)
        disparity_visual = cv.CreateMat(c, r, cv.CV_8U)
        cv.Normalize(disparity, disparity_visual, 0, 255, cv.CV_MINMAX)
        disparity_visual = np.array(disparity_visual)

    elif method == "SGBM":
        sbm = cv2.StereoSGBM()
        sbm.SADWindowSize = 5
        #Matched block size. It must be an odd number >=1 . Normally, it should be somewhere in the 3..11 range.
        sbm.numberOfDisparities = 16
        #con valori piu alti tipo 112 viene il contorno nero
        sbm.preFilterCap = 1
        sbm.minDisparity = 0
        #con altri valori smongola
        sbm.uniquenessRatio = 7
        sbm.speckleWindowSize = 100
        sbm.speckleRange = 2
        sbm.disp12MaxDiff = 1
        sbm.fullDP = False
        #a True runna il full-scale two-pass dynamic programming algorithm

        disparity = sbm.compute(gray_left, gray_right)
        disparity_visual = cv2.normalize(disparity,
                                         alpha=0,
                                         beta=255,
                                         norm_type=cv2.cv.CV_MINMAX,
                                         dtype=cv2.cv.CV_8U)

    return disparity_visual
Beispiel #19
0
def calc_disparity(left_image, right_image):
    window_size = 3
    min_disp = 1
    num_disp = 16 * 2
    stereo = cv2.StereoSGBM(minDisparity=min_disp,
                            numDisparities=num_disp,
                            SADWindowSize=window_size,
                            uniquenessRatio=10,
                            speckleWindowSize=100,
                            speckleRange=32,
                            disp12MaxDiff=1,
                            P1=8 * 3 * window_size**2,
                            P2=32 * 3 * window_size**2,
                            fullDP=False)
    return stereo.compute(left_image, right_image).astype(np.float32) / 16.0
def getDisparity(imgLeft, imgRight, method="BM"):

    gray_left = cv2.cvtColor(imgLeft, cv.CV_BGR2GRAY)
    gray_right = cv2.cvtColor(imgRight, cv.CV_BGR2GRAY)
    print gray_left.shape
    c, r = gray_left.shape
    if method == "BM":
        sbm = cv.CreateStereoBMState()
        disparity = cv.CreateMat(c, r, cv.CV_32F)
        sbm.SADWindowSize = 9
        sbm.preFilterType = 1
        sbm.preFilterSize = 5
        sbm.preFilterCap = 61
        sbm.minDisparity = -39
        sbm.numberOfDisparities = 112
        sbm.textureThreshold = 507
        sbm.uniquenessRatio = 0
        sbm.speckleRange = 8
        sbm.speckleWindowSize = 0

        gray_left = cv.fromarray(gray_left)
        gray_right = cv.fromarray(gray_right)

        cv.FindStereoCorrespondenceBM(gray_left, gray_right, disparity, sbm)
        disparity_visual = cv.CreateMat(c, r, cv.CV_8U)
        cv.Normalize(disparity, disparity_visual, 0, 255, cv.CV_MINMAX)
        disparity_visual = np.array(disparity_visual)

    elif method == "SGBM":
        sbm = cv2.StereoSGBM()
        sbm.SADWindowSize = 9
        sbm.numberOfDisparities = 96
        sbm.preFilterCap = 63
        sbm.minDisparity = -21
        sbm.uniquenessRatio = 7
        sbm.speckleWindowSize = 0
        sbm.speckleRange = 8
        sbm.disp12MaxDiff = 1
        sbm.fullDP = False

        disparity = sbm.compute(gray_left, gray_right)
        disparity_visual = cv2.normalize(disparity,
                                         alpha=0,
                                         beta=255,
                                         norm_type=cv2.cv.CV_MINMAX,
                                         dtype=cv2.cv.CV_8U)

    return disparity_visual
Beispiel #21
0
def stereosgbm(config, left_image, right_image):
    #l_t = cv2.pyrDown(left_image)
    #r_t = cv2.pyrDown(right_image)

    stereo = cv2.StereoSGBM(
        config.stereosgbm.min_disparity, config.stereosgbm.num_disparities,
        config.stereosgbm.sad_window_size, config.stereosgbm.p1,
        config.stereosgbm.p2, config.stereosgbm.disp12_max_diff,
        config.stereosgbm.prefilter_cap, config.stereosgbm.uniqueness_ratio,
        config.stereosgbm.speckle_window_size, config.stereosgbm.speckle_range,
        config.stereosgbm.full_dp)

    disparity = stereo.compute(left_image, right_image)
    disparity *= 255 / (disparity.min() - disparity.max())
    disparity = disparity.astype(numpy.uint8)

    return disparity
def stereo_process(imgL, imgR, outprefix):
    # disparity range is tuned for 'aloe' image pair
    window_size = 3
    min_disp = 16
    num_disp = 112 - min_disp
    stereo = cv2.StereoSGBM(minDisparity=min_disp,
                            numDisparities=num_disp,
                            SADWindowSize=window_size,
                            uniquenessRatio=10,
                            speckleWindowSize=100,
                            speckleRange=32,
                            disp12MaxDiff=1,
                            P1=8 * 3 * window_size**2,
                            P2=32 * 3 * window_size**2,
                            fullDP=False)

    print 'computing disparity...'
    disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0

    print 'generating 3d point cloud...',
    h, w = imgL.shape[:2]
    f = 0.8 * w  # guess for focal length
    Q = np.float32([
        [1, 0, 0, -0.5 * w],
        [0, -1, 0, 0.5 * h],  # turn points 180 deg around x-axis,
        [0, 0, 0, -f],  # so that y-axis looks up
        [0, 0, 1, 0]
    ])
    points = cv2.reprojectImageTo3D(disp, Q)
    colors = cv2.cvtColor(imgL, cv2.COLOR_BGR2RGB)
    mask = disp > disp.min()
    out_points = points[mask]
    out_colors = colors[mask]
    if (outprefix):
        out_fn = outprefix + '.ply'
        write_ply(out_fn, out_points, out_colors)
        print '%s saved' % out_fn

    cv2.imshow('left', imgL)
    cv2.imshow('disparity', (disp - min_disp) / num_disp)
    cv2.waitKey()
    cv2.destroyAllWindows()
Beispiel #23
0
def doTheThing(l, r):
    print(os.path.isfile(l))
    print(os.path.isfile(r))
    print('loading images...')
    imgL = cv2.pyrDown(cv2.imread(l))
    imgR = cv2.pyrDown(cv2.imread(r))

    window_size = 3
    min_disp = 16
    num_disp = 112 - min_disp
    stereo = cv2.StereoSGBM(minDisparity=min_disp,
                            SADWindowSize=window_size,
                            numDisparities=num_disp,
                            P1=8 * 3 * window_size**2,
                            P2=32 * 3 * window_size**2,
                            disp12MaxDiff=1,
                            uniquenessRatio=10,
                            speckleWindowSize=100,
                            speckleRange=32)

    print('computing disparity...')
    disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
    saveModel(disp)
    print('generating 3d point cloud...')
    h, w = imgL.shape[:2]
    f = 0.8 * w  # guess for focal length
    Q = np.float32([
        [1, 0, 0, -0.5 * w],
        [0, -1, 0, 0.5 * h],  # turn points 180 deg around x-axis,
        [0, 0, 0, -f],  # so that y-axis looks up
        [0, 0, 1, 0]
    ])
    points = cv2.reprojectImageTo3D(disp, Q)
    colors = cv2.cvtColor(imgL, cv2.COLOR_BGR2RGB)
    mask = disp > disp.min()
    out_points = points[mask]
    out_colors = colors[mask]
    out_fn = saveFolder + 'out.ply'
    sides, faces = findFaces(out_points, disp)
    write_ply(out_fn, out_points, out_colors, faces, sides)
    print('%s saved' % 'out.ply')
Beispiel #24
0
    def __init__(self, bm_type='bm'):
        self.bm_type = bm_type
        unitDisparity = 15
        numberOfDisaprities = unitDisparity * 16

        if bm_type == 'bm':
            bm = cv2.StereoBM().create()
            # bm.setROI1(validPixROI1)
            # bm.setROI2(validPixROI2)
            bm.setBlockSize(21)
            bm.setPreFilterCap(13)
            bm.setMinDisparity(0)
            bm.setNumDisparities(numberOfDisaprities)
            bm.setTextureThreshold(20)
            bm.setUniquenessRatio(10)
            bm.setSpeckleWindowSize(19)
            bm.setSpeckleRange(32)
            bm.setDisp12MaxDiff(5)
            self.bm = bm

        elif bm_type == 'sgbm':
            bm = cv2.StereoSGBM().create()
            SADWindowSize = 11
            mindisparity = 0
            ndisparities = 64
            bm.setMinDisparity(0)
            bm.setNumDisparities(64)
            bm.setBlockSize(SADWindowSize)
            channel = 1
            P1 = 8 * channel * SADWindowSize * SADWindowSize
            P2 = 32 * channel * SADWindowSize * SADWindowSize
            bm.setP1(P1)
            bm.setP2(P2)
            bm.setPreFilterCap(15)
            bm.setUniquenessRatio(10)
            bm.setSpeckleRange(2)
            bm.setSpeckleWindowSize(100)
            bm.setDisp12MaxDiff(cv2.STEREO_SGBM_MODE_SGBM)
            self.bm = bm
        else:
            raise AssertionError('bm_type must be select in sgbm and bm')
Beispiel #25
0
def compute():
    #stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET, disp, size)
    stereo = cv2.StereoSGBM(0,
                            disp,
                            size,
                            P1=8 * 1 * size * size,
                            P2=32 * 1 * size * size,
                            disp12MaxDiff=1,
                            preFilterCap=63,
                            uniquenessRatio=10,
                            speckleWindowSize=100,
                            speckleRange=32,
                            fullDP=True)

    disparity = stereo.compute(imgL, imgR)
    image = cv2.normalize(disparity,
                          alpha=0,
                          beta=255,
                          norm_type=cv2.NORM_MINMAX,
                          dtype=cv2.CV_8U)

    cv2.imshow('depth', image)
Beispiel #26
0
def estimateDisparity(image_left,image_right,method='SGBM'):
    if method=='SGBM':
        import cv2
        
        disparityrange=[0,15]
        
        ndisparities=int(np.ceil(disparityrange[1]-disparityrange[0])	)
        ndisparities=16*int(np.ceil(float(ndisparities)/16))
        minDisparity=int(np.floor(disparityrange[0]))
        #stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET,ndisparities=ndisparities, SADWindowSize=15)
        #stereo = cv2.StereoSGBM(minDisparity=mindisparity,numDisparities=ndisparities, SADWindowSize=15,P1=10000,P2=0)
        stereo = cv2.StereoSGBM(minDisparity=minDisparity,numDisparities=ndisparities, SADWindowSize=3,P1=30,P2=30)
        
        right_disparity = stereo.compute(image_left[:,:,0],image_right[:,:,0])# does not work in color...
        right_disparity=right_disparity/16.
    elif method=='BM':
  
    
    
        stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET,ndisparities=ndisparities,  SADWindowSize=5)
        right_disparity = stereo.compute(image_left[:,:,0],image_right[:,:,0],disptype=cv2.CV_32F)# does not work in color...
    return right_disparity
Beispiel #27
0
    def doThings(self):
        sgbm = cv2.StereoSGBM()
        sgbm.SADWindowSize, maxDisp, sgbm.preFilterCap, sgbm.minDisparity, \
        sgbm.uniquenessRatio, sgbm.speckleWindowSize, sgbm.P1, sgbm.P2, \
        sgbm.speckleRange = [v for v, _ in self.params.itervalues()]
        sgbm.numberOfDisparities = maxDisp - sgbm.minDisparity
        sgbm.disp12MaxDiff = 1
        sgbm.fullDP = True

        self.disp = sgbm.compute(np.rot90(self.top_r, 1),
                                 np.rot90(self.bottom_r, 1)).astype(
                                     np.float32) / 16.0
        self.disp = np.rot90(self.disp, 3)
        disp8 = (self.disp - sgbm.minDisparity) / sgbm.numberOfDisparities
        self.roi_mask = np.zeros_like(self.disp).astype(np.bool)
        self.roi_mask[self.roi[1]:self.roi[3], self.roi[0]:self.roi[2]] = True
        #        dispRgb = cv2.cvtColor(disp8, cv2.COLOR_GRAY2RGB)
        dispRgb = utility.get_heatmap(disp8)
        self.mask = self.disp > self.disp.min()
        dispRgb[~(self.mask * self.roi_mask)] = [255, 255, 255]
        disp_small = cv2.resize(dispRgb,
                                (dispRgb.shape[1] / 2, dispRgb.shape[0] / 2))
        cv2.imshow(self.winname, disp_small)
    def stereoSGBM(self, img_left, img_right):

        stereo = cv2.StereoSGBM(minDisparity=0,
                                numDisparities=self._max_disparity,
                                SADWindowSize=self._sad_winsize,
                                uniquenessRatio=self._uniqueness_ratio,
                                P1=self._P1,
                                P2=self._P2,
                                speckleWindowSize=self._speckle_winsize,
                                speckleRange=self._speckle_range)
        disp_left = stereo.compute(img_left, img_right)
        disp_left_visual = np.zeros((img_left.shape[0], img_left.shape[1]),
                                    np.uint8)
        disp_left_visual = cv2.normalize(disp_left,
                                         alpha=0,
                                         beta=self._max_disparity,
                                         norm_type=cv2.cv.CV_MINMAX,
                                         dtype=cv2.cv.CV_8U)

        img_foreground, disp_foreground = self.extractForeground(
            disp_left_visual, img_left, self._fgnd_disp_thresh)

        return (disp_left_visual, disp_foreground, img_foreground)
Beispiel #29
0
def createBM():
    global stereo
    global P1
    global P2
    global size
    global disp

    P1 = P1 * size * size
    P2 = P2 * size * size

    #stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET, disp, size)
    stereo = cv2.StereoSGBM(
        0,
        disp,
        size,
        P1=P1,  #*size*size, 
        P2=P2,  #*size*size, 
        disp12MaxDiff=15,
        preFilterCap=67,
        uniquenessRatio=15,
        speckleWindowSize=100,
        speckleRange=10,
        fullDP=True)
Beispiel #30
0
def processInput():
    print ""
    if inputArgs.left == "" or inputArgs.right == "":
        print "Missing images!"
        quit()

    # here we go ...

    # load image pair
    img_l = cv2.imread(inputArgs.left)
    img_r = cv2.imread(inputArgs.right)

    if img_l == None or img_r == None:
        print "Missing images!"
        quit()

    # disparity range
    window_size = 5
    min_disp = 16
    num_disp = 112 - min_disp

    stereo = cv2.StereoSGBM(minDisparity=min_disp,
                            numDisparities=num_disp,
                            SADWindowSize=window_size,
                            uniquenessRatio=10,
                            speckleWindowSize=100,
                            speckleRange=32,
                            disp12MaxDiff=1,
                            P1=8 * 3 * window_size**2,
                            P2=32 * 3 * window_size**2,
                            fullDP=False)

    print 'Computing disparity ...'
    disp = stereo.compute(img_l, img_r).astype(np.float32) / 16.0

    cv2.imwrite(inputArgs.name + "_disparity.jpg", disp)