Рассчитать несоответствие по карте несоответствия - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь рассчитать диспаратность, используя отображаемую карту диспаратности, используя код ниже. В настоящее время я получаю Как ограничить выбранные пиксели в определенной области на оси x, y и значении диспаратности для выбранных пикселей.

В настоящее время, когда я печатаю диспаратность, я получаю матрицу, котораяЯ не могу использовать для расчета несоответствия. Я использую формулу D = bf / d, где D - расстояние, b - базовая линия, f - фокусное расстояние, а d - диспаратность. Я знаю базовую линию, фокусное расстояние и фактическое расстояние, но не могу получить правильное расстояние, используя карту диспаратности.

Как мне внедрить это в мой код?

Если это поможет, я получу k-матрицу из калибровки камеры, однако я не знаю, как использовать ее в своем коде.


from __future__ import print_function

import numpy as np
import cv2 as cv
from PIL import Image
from matplotlib import pyplot as plt


def main():
    print('loading images...')
    imgL = cv.imread('00004l.png')
    imgR = cv.imread('00004r.png')

    #Disparity settings
    window_size = 5
    min_disp = 16
    num_disp = 112-min_disp
    matcher_left = cv.StereoSGBM_create(
        blockSize = 5,
        numDisparities = num_disp,
        minDisparity = min_disp,
        P1 = 8*3*window_size**2,
        P2 = 32*3*window_size**2,
        disp12MaxDiff = 10,
        uniquenessRatio = 10,
        speckleWindowSize = 100,
        speckleRange = 5,
        preFilterCap=1,
        mode=cv.STEREO_SGBM_MODE_SGBM_3WAY
    )

    matcher_right = cv.ximgproc.createRightMatcher(matcher_left)

    # Filter
    lmbda = 80000 #org 80000
    sigma = 1.2 #org 1.2
    visual_multiplier = 1.0

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

    print('computing disparity...')
    disp = matcher_left.compute(imgL, imgR).astype(np.float32) / 16
    displ = matcher_left.compute(imgL, imgR).astype(np.float32) / 16
    dispr = matcher_right.compute(imgR, imgL).astype(np.float32) / 16
    displ = np.int16(displ)
    dispr = np.int16(dispr)
    filteredImg = wls_filter.filter(displ, imgL, None, dispr)

    # Display the result
    filteredImg = cv.normalize(src=filteredImg, dst=filteredImg, beta=0, alpha=255, norm_type=cv.NORM_MINMAX, dtype=cv.CV_8U);
    filteredImg = np.uint8(filteredImg)

    #print distance

    b = 120
    f = 510

    D = b * f / d

    print (disp)

    print (D)

    plt.imshow(filteredImg, 'gray')
    plt.show()
    cv.waitKey()

    print('Done')


if __name__ == '__main__':
    main()
    cv.destroyAllWindows(1)
...