Как получить субпиксельные различия в объектах AVDepthData

Я работаю над быстрым приложением, которое должно измерять физические правильные z-значения человека, стоящего перед статически установленным iPhone 7+. Поэтому я использую объекты AVDepthData, которые содержат карты глубины, поступающие из системы двойной камеры.

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

Вот два файла, которые визуализируют проблему:

Захваченная карта глубины, обрезанные значения Z через 4,0 м: карта глубины со значениями Z в легенде

Текстурированное облако точек, вид сбоку (90°): облако точек, визуализированное с iPhone

Согласно документации Apple, я уже отключил временную фильтрацию и развернул изображения, используя коэффициенты искажения из таблицы поиска, чтобы получить правильные мировые координаты.

Фильтрация данных глубины делает его более полезным для применения визуальных эффектов к сопутствующему изображению, но изменяет данные таким образом, что они больше не подходят для задач компьютерного зрения. (На нефильтрованной карте глубины пропущенные значения представлены как NaN.)

Есть ли способ получить карты глубины с субпиксельной точностью, чтобы правильно измерить человека, стоящего перед камерой?

Ниже вы можете найти код Python, который я написал для создания облаков точек в автономном режиме, метод calculate_rectified_point был предоставлен Apple для удаления искажения линз с изображений.

for v in range(height):
    for u in range(width):
        r, g, b = rgb_texture[v, u]
        z = depth_map[v, u]

        if z <= 0:
            continue

        # Step 1: inverse the intrinsic parameters
        x = (u - center[0]) / focal_lengths[0]
        y = (v - center[1]) / focal_lengths[1]

        # Step 2: remove the radial and tangential distortion
        x_un, y_un = calculate_rectified_point((x, y), dist_coefficients, optical_center, (width, height))

        # Step 3: inverse extrinsic parameters
        x, y, z = extrinsic_matrix_inv.dot(np.array([x_un * z, y_un * z, z]))

0 ответов

Другие вопросы по тегам