Найти все плоские поверхности в изображении с использованием глубины и нормальных данных - PullRequest
1 голос
/ 24 апреля 2019

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

У меня уже есть глубина и нормаль каждого пикселя в изображении. Для каждого пикселя (ui, vi) предположим, что мы можем получить его трехмерные координаты (xi, yi, zi) с zi в качестве вектора глубины и нормали (nix, niy, niz). Таким образом, уникальная касательная плоскость определяется следующим образом: nix(x - xi) + niy(y - yi) + niz(z - zi) = 0. Тогда для каждого пикселя мы можем определить уникальную плоскую поверхность по приведенному выше уравнению.

  1. Какова общая практика при нахождении функции f такой, что f(u, v) = (x, y, z) (от пикселя до трехмерных координат)? Является ли модель точечного отверстия (плюс данные о глубине) эффективной и точной?

  2. Как эффективно генерировать все плоские поверхности? Один из способов - перебрать все пиксели на изображении и найти все плоскости, но этот метод кажется неэффективным.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

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

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

0 голосов
/ 24 апреля 2019
  1. Если его модель-обскура

    убедитесь, что ваши 3D-данные не искажены проекцией.

  2. сгруппируйте ваши очки по нормам

    это легко или сложно в зависимости от очков / нормальной точности. Просто отсортируйте точки по нормали, что приводит к O(n.log(n)), где n - количество точек.

  3. испытание / группировка по самолетам в одной нормальной группе

    Идея состоит в том, чтобы выбрать 3 точки из плоскости вычислений группы и проверить, какие точки группы принадлежат ей. Если счет слишком низкий, вы выбрали неверные точки (не принадлежащие к одной плоскости) и вам нужно выбрать разные. Также, если выбранные точки находятся слишком близко к каждой или на одной линии, вы не можете получить правильную плоскость от нее.

    Математическая функция для плоскости:

    x*nx + y*ny + z*nz + d = 0
    

    , где (nx,ny,nz) - нормали к группе (единичный вектор), а (x,y,z) - ваша точечная позиция. Таким образом, вы просто вычисляете d из известной точки (одна из выбранных (x0,y0,z0)) ...

    d = -x0*nx -y0*ny -z0*nz
    

    , а затем просто проверьте, какие точки удовлетворяют этому условию:

    threshod=1e-20; // just accuracy margin
    fabs(x*nx + y*ny + z*nz + d) <= threshod
    

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

    затем проверить другую группу, пока не останется ни одной группы ...

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

...