Как улучшить результаты StereoSGBM с помощью текстуры - PullRequest
2 голосов
/ 20 мая 2019

Так что я делаю стерео 360 для 6Dof для старшего школьного проекта.Мои результаты несоответствия приличные, но мне было интересно, есть ли способ сделать их лучше, особенно с тем, как они обрабатывают текстуру.Карта диспаратности должна исчезать по мере удаления точек, но, поскольку StereoSGBM плохо обрабатывает текстуру, удаленные точки неоправданно близки.Также небо должно казаться черным, но оно довольно светлое.Карта диспаратности: https://imgur.com/MqK4gMU

Я использую StereoSGBM, чтобы получить карту диспаратности для 2 камер Ricoh Theta SC.Я попытался отрегулировать настройки диспаратности и играть с яркостью и контрастом с введенными изображениями.Я также попытался изменить режим StereoSGBM (HH, SGBM, SGBM_3WAY), перевернуть входные изображения и использовать StereoBM вместо SGBM.Я не пробовал калибровать камеры (кроме смещения изображений, чтобы камеры указывали в одном и том же направлении), потому что я полагал, что, если калибровка камеры будет проблемой, у меня будут гораздо худшие результаты.Есть ли какая-то другая функция несоответствия, которую я мог бы использовать, кроме StereoSGBM, которая дала бы мне лучший результат.Стоит ли использовать машинное обучение с Google Cloud для создания лучшей модели неравенства?Я мог бы использовать набор глубинных данных NYU (https://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.html)) для обучения модели. У кого-нибудь есть идеи, как улучшить мои результаты?

import numpy as np
import cv2 as cv
from sklearn.preprocessing import normalize
from PIL import Image, ImageEnhance, ImageOps


def func_disparity(window_size, minDisparity2, numDisparities2, blockSize2, 
    disp12MaxDiff2, uniquenessRatio2, speckleWindowSize2, speckleRange2, 
    preFilterCap2, brightness,
    contrast, event=None):

    imgR = Image.open(FILE_NAME)
    imgL = Image.open(FILEN_NAME)
    print(imgL.size)

    imgL = ImageOps.expand(imgL, border=50)
    imgR = ImageOps.expand(imgR, border=50)    

    contrastL = ImageEnhance.Contrast(imgL)
    contrastR = ImageEnhance.Contrast(imgR)
    imgL = contrastL.enhance(contrast)
    imgR = contrastR.enhance(contrast)

    brightnessL = ImageEnhance.Brightness(imgL)
    brightnessR = ImageEnhance.Brightness(imgR)
    imgL = brightnessL.enhance(brightness)
    imgR = brightnessR.enhance(brightness)

    imgL = imgL.convert('L')
    imgL = np.array(imgL)
    imgR = imgR.convert('L')
    imgR = np.array(imgR)


    #window_size = 15                     wsize default 3; 5; 7 for SGBM reduced size image; 15 for SGBM full size image (1300px and above); 5 Works nicely

    left_matcher = cv.StereoSGBM_create(
        minDisparity=minDisparity2,
        numDisparities=numDisparities2,             # max_disp has to be 
        dividable by 16 f. E. HH 192, 256
        blockSize= blockSize2,
        P1=8 * 3 * window_size ** 2,    # wsize default 3; 5; 7 for SGBM 
        reduced size image; 15 for SGBM full size image (1300px and above); 5 
        Works nicely
        P2=32 * 3 * window_size ** 2,
        disp12MaxDiff=disp12MaxDiff2,
        uniquenessRatio=uniquenessRatio2,
        speckleWindowSize=speckleWindowSize2,
        speckleRange=speckleRange2,
        preFilterCap= preFilterCap2,
        mode=cv.STEREO_SGBM_MODE_SGBM_3WAY
        )

    right_matcher = cv.ximgproc.createRightMatcher(left_matcher)

    # FILTER Parameters
    lmbda = 80000
    sigma = 1.2
    visual_multiplier = 1.0

    wls_filter = 
    cv.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher)
    wls_filter.setLambda(lmbda)
    wls_filter.setSigmaColor(sigma)

    print('computing disparity...')
    displ = left_matcher.compute(imgL, imgR)  # .astype(np.float32)/16
    dispr = right_matcher.compute(imgR, imgL)  # .astype(np.float32)/16
    displ = np.int16(displ)
    dispr = np.int16(dispr)
    filteredImg = wls_filter.filter(displ, imgL, None, dispr)  # important to 
    put "imgL" here!!!

    filteredImg = cv.normalize(src=filteredImg, dst=filteredImg, beta=0, 
    alpha=255, norm_type=cv.NORM_MINMAX);
    filteredImg = np.uint8(filteredImg)

    height, width = filteredImg.shape
    filteredImg = np.delete(filteredImg, np.s_[0:50], axis=0)
    filteredImg = np.delete(filteredImg, np.s_[height-100:height-50], axis=0)
    filteredImg = np.delete(filteredImg, np.s_[0:50], axis=1)
    filteredImg = np.delete(filteredImg, np.s_[width-100:width-50], axis=1)
    print(filteredImg.shape)

    return(filteredImg)
    #print(filteredImg)
    #file = Image.fromarray(filteredImg)
    #file.save("disparitymap.jpg")
    print("Done")

window_size = 3
minDisparity2 = 15
numDisparities2=16      #160max_disp has to be dividable by 16 f. E. HH 192, 
blockSize2=20   #Maybe 20 is optimal
disp12MaxDiff2=1
uniquenessRatio2=15
speckleWindowSize2=0
speckleRange2=2
preFilterCap2=63
brightness=1
contrast=1

disparity = func_disparity(window_size, minDisparity2, numDisparities2, blockSize2, disp12MaxDiff2, uniquenessRatio2, speckleWindowSize2, speckleRange2, preFilterCap2, brightness, contrast, event=None)

file = Image.fromarray(disparity)
file.show()
'''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...