Збіг профілю в точковій хмарі


14

Хмара точок генеруються з використанням рівномірної випадкової функції для (x,y,z). Як показано на наступному малюнку, досліджується плоска пересічна площина ( профіль ), яка відповідає найкращому (навіть якщо не точному) цільовому профілю, тобто наведеному в лівому нижньому куті. Отже, питання :

1- Як знайти таку відповідність за target 2D point mapдопомогою point cloudнаведених нижче приміток / умов?
2- Які тоді координати / орієнтації / ступінь подібності тощо?

Примітка 1: Цікавий профіль може бути будь-де з будь-яким обертанням по осях, а також може бути різної форми, наприклад, трикутник, прямокутник, чотирикутник тощо, залежно від місця його розташування та орієнтації. На наступній демонстрації показаний лише простий прямокутник.

Примітка 2: величиною допуску можна вважати відстань точок від профілю. Щоб продемонструвати це на наступному малюнку припустимо допуск 0.01раз найменший розмір (~1)так tol=0.01. Отже, якщо ми видалимо решту та спроектуємо всі точки, що залишилися на площині профілю, що досліджується, ми зможемо перевірити його схожість із цільовим профілем.

Примітка 3: Пов'язана тема може бути знайдена в Розпізнаванні точкових шаблонів .

введіть тут опис зображення


@Developer Off topic, але яке програмне забезпечення ви використовуєте для створення цих сюжетів?
Спейсі

1
@Mohammad Я використовую Python+ MatPlotLibдля проведення своїх досліджень та для створення графіків тощо.
Розробник

@Developer Fantastic - це через Python, але що вони означають "Python shell ala Matlab"?
Спейсі

Як зберігаються точкові хмари? Як набір координат для центру кожної точки або як об'ємний набір даних, який має ненульові значення в координатах навколо точок?
ендоліт

@endolith Усі точки мають координати, позначені як P:{x,y,z}. Вони справді є безрозмірними точками. Однак з деяким наближенням вони можуть бути дискретизовані на розмір одного пікселя як 3D-масиви. Вони можуть містити й інші атрибути (наприклад, ваги тощо) над координатами.
Розробник

Відповіді:


4

Це завжди потребує великих обчислень, особливо якщо ви хочете обробити цілих 2000 балів. Я впевнений, що вже є високооптимізовані рішення для такого типу узгодження шаблонів, але ви повинні розібратися, як це називається, щоб знайти їх.

Оскільки ви говорите про хмару точок (розріджені дані) замість зображення, мій метод перехресної кореляції насправді не застосовується (і був би ще гіршим обчислювальним). Щось на зразок RANSAC, ймовірно, швидко знайде відповідність, але я не знаю багато про це.

Моя спроба рішення:

Припущення:

  • Ви хочете знайти найкращий матч, а не просто вільний або "ймовірно правильний" матч
  • Матч матиме невелику кількість помилок через шум у вимірюванні чи обчисленнях
  • Вихідні точки є копланарними
  • Усі вихідні точки повинні існувати в цілі (= будь-яка незрівнянна точка - це невідповідність для всього профілю)

Таким чином, ви повинні мати можливість приймати багато ярликів, дискваліфікуючи речі та скорочуючи час на обчислення. Коротко:

  1. виберіть три точки від джерела
  2. пошук по цільових точках, знаходження наборів з 3 балів однакової форми
  3. коли буде знайдено збіг у 3 бали, перевірте всі інші точки в площині, яку вони визначають, щоб побачити, чи вони близькі
  4. якщо знайдено більше, ніж одна відповідність усіх точок, виберіть одну з найменшою сумою помилки відстаней 3D

Більш детально:

pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2

for all (x,y,z) test points t1 in target:
    # imagine s1 and t1 are coincident
    for all other points t2 in target:
        if distance from test point > d12:    
            break out of loop and try another t2 point
        if distance ≈ d12:
            # imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
            for all other points t3 in target:
                if distance from t1 > d13 or from t2 > d23:
                    break and try another t3
                if distance from t1 ≈ d13 and from t2 ≈ d23:
                    # Now you've found matching triangles in source and target
                    # align source so that s1, s2, s3 are coplanar with t1, t2, t3
                    project all source points onto this target plane 
                    for all other points in source:
                        find nearest point in target
                        measure distance from source point to target point
                        if it's not within a threshold:
                            break and try a new t3
                        else:
                            sum errors of all matched points for this configuration (defined by t1, t2, t3)

Яка б конфігурація не мала найменшої квадратичної помилки для всіх інших точок, найкраща відповідність

Оскільки ми працюємо з трьома найближчими пунктами тестування сусідів, відповідні цільові точки можна спростити, перевіривши, чи знаходяться вони в деякому радіусі. Наприклад, шукаючи радіус 1 від (0, 0), наприклад, ми можемо дискваліфікувати (2, 0) на основі x1 - x2, не обчислюючи фактичну відстань Евкліда, щоб трохи прискорити його. Це передбачає, що віднімання швидше, ніж множення. Існують також оптимізовані пошуки на основі більш довільного фіксованого радіуса .

function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
    if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
        return False
    return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow

г=(х1-х2)2+(у1-у2)2+(z1-z2)2

(2000 рік2)

Насправді, оскільки вам все одно потрібно буде обчислити, чи знаходите ви відповідність чи ні, і оскільки для цього кроку ви дбаєте лише про найближчих сусідів, якщо у вас є пам'ять, можливо, краще попередньо обчислити ці значення за допомогою оптимізованого алгоритму . Щось на зразок триангуляції Делоне або Піттейвей , де кожна точка в цілі пов'язана з найближчими сусідами. Зберігайте їх у таблиці, а потім шукайте їх у кожній точці, намагаючись прилаштувати вихідний трикутник до одного із цільових трикутників.

Існує багато обчислень, але це має бути відносно швидким, оскільки він працює лише над даними, які є рідкісними, замість того, щоб помножувати безліч безглуздих нулів разом, як передбачає перехресне співвідношення об'ємних даних. Ця ж ідея спрацювала б і для випадку 2D, якщо ви спочатку знайшли центри точок і зберегли їх як набір координат.


1
Перша частина вашої відповіді - це фактично груба сила, яка шукає точки поблизу (рахуючи відносно порогу) навколо всіх можливих площин через хмару точок. Це надзвичайно інтенсивно обчислюється, наприклад, лише для 2000 балів знадобиться 2,662,668,000,000 (Формула) дистанційного обчислення!
Розробник

@Developer: Так, буде потрібно багато розрахунків, особливо якщо у вас тисячі балів. Так, за 2000 балів, якщо ви не знайдете жодної площини, ви в кінцевому підсумку зробите 2,658,673,998 000 розрахунків. Імовірно ви б знайти літаки, хоча, що дозволить скоротити час , тому що він зупиняється , як тільки він знайшов достатню кількість очок. Але все одно я думав над цим і, мабуть, маю кращу ідею, і я зміню відповідь.
ендоліт

1
Ви абсолютно зрозуміли справу. Просто додамо, що критерії зупинки не можуть застосовуватися навіть після пошуку підходящої площини, хоча може бути набагато краща відповідність, тому всі можливі площини потрібно перевірити. Я вже реалізував цю ідею і виявив, що навіть за допомогою Fortranномерів, що перевищують 500бали, мати досвід із ПК неможливо.
Розробник

2

Я б додав @ mirror2image опис альтернативного рішення поруч з RANSAC, ви можете розглянути алгоритм ICP (найближча ітеративна точка), опис можна знайти тут !

Я думаю, що наступним завданням у використанні цього ICP є визначення власної функції витрат та вихідної позиції цільової площини щодо даних 3d хмарної точки. Деякий практичний підхід полягає у введенні деякого випадкового шуму в дані під час ітерації, щоб уникнути наближення до помилкових мінімумів. Це евристична частина, яку я думаю, вам потрібно розробити.

Оновлення:

Крок у спрощеній формі:

  1. Знайдіть найближчу точку для кожної точки введення.
  2. Обчисліть перетворення від введення до цілі, а потім перемістіть вхідні точки за допомогою перетворення.
  3. Обчисліть функцію подібності (наприклад, відстань для кожної точки входу wrt до відповідної цільової точки пари).
  4. Перевірте стан зупинки.

Повторіть крок 1-4.

Тут є бібліотека, яку ви можете розглянути тут ! (Я ще не пробував цього), є один розділ про реєстраційну частину (включаючи інші методи).


Дякуємо за посилання та пропозицію. Такі корисні ідеї допомагають нам завжди, як початківцям дослідникам, швидше дізнатися щось. Я завжди ціную більше пояснень.
Розробник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.