Реализация карты несоответствия в Python не соответствует встроенной функции OpenCV - PullRequest
1 голос
/ 04 февраля 2020

Я столкнулся с проблемой и хотел бы получить от сообщества информацию о том, как улучшить карту расхождений. Я следую этому руководству для расчета карты расхождений между двумя изображениями. У меня есть следующий код:

import cv2
import numpy as np
import sys
from matplotlib import pyplot as plt

num_disparities = 64  # number of disparities to check
block = 9  # block size to match

def preprocess_frame(path):
    image = cv2.imread(path, 0)
    image = cv2.equalizeHist(image)
    image = cv2.GaussianBlur(image, (5, 5), 0)
    return image

def calculate_disparity_matrix(args):
    left_image = preprocess_frame(args[1])
    right_image = preprocess_frame(args[2])
    rows, cols = left_image.shape

    kernel = np.ones([block, block]) / block

    disparity_maps = np.zeros(
        [left_image.shape[0], left_image.shape[1], num_disparities])
    for d in range(0, num_disparities):
        # shift image
        translation_matrix = np.float32([[1, 0, d], [0, 1, 0]])
        shifted_image = cv2.warpAffine(
            right_image, translation_matrix,
            (right_image.shape[1], right_image.shape[0]))
        # calculate squared differences
        SAD = abs(np.float32(left_image) - np.float32(shifted_image))
        # convolve with kernel and find SAD at each point
        filtered_image = cv2.filter2D(SAD, -1, kernel)
        disparity_maps[:, :, d] = filtered_image

    disparity = np.argmin(disparity_maps, axis=2)
    disparity = np.uint8(disparity * 255 / num_disparities)
    disparity = cv2.equalizeHist(disparity)
    plt.imshow(disparity, cmap='gray', vmin=0, vmax=255)
    plt.show()


def calculate_disparity_inbuilt(args):
    left_image = preprocess_frame(args[1])
    right_image = preprocess_frame(args[2])
    rows, cols = left_image.shape
    stereo = cv2.StereoBM_create(numDisparities=num_disparities,
                                 blockSize=block)
    disparity = stereo.compute(left_image, right_image)
    plt.imshow(disparity, cmap='gray', vmin=0, vmax=255)
    plt.show()

Проблема в том, что вывод, который я получаю из встроенной функции в OpenCV, вряд ли похож на тот, который я реализовал. Я ожидал хотя бы небольшого сходства между 2. Ожидается ли это? или я здесь что-то не так делаю?

Реализованный алгоритм Алгоритм OpenCV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...