Как получить субпиксельную точность карт глубины в AVDepthData - PullRequest
1 голос
/ 26 сентября 2019

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

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

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

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

Текстурированное Pointcloud, вид сбоку (90 °): Pointcloud, отображаемое с iPhone

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

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

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

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

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]))
...