Це завжди потребує великих обчислень, особливо якщо ви хочете обробити цілих 2000 балів. Я впевнений, що вже є високооптимізовані рішення для такого типу узгодження шаблонів, але ви повинні розібратися, як це називається, щоб знайти їх.
Оскільки ви говорите про хмару точок (розріджені дані) замість зображення, мій метод перехресної кореляції насправді не застосовується (і був би ще гіршим обчислювальним). Щось на зразок RANSAC, ймовірно, швидко знайде відповідність, але я не знаю багато про це.
Моя спроба рішення:
Припущення:
- Ви хочете знайти найкращий матч, а не просто вільний або "ймовірно правильний" матч
- Матч матиме невелику кількість помилок через шум у вимірюванні чи обчисленнях
- Вихідні точки є копланарними
- Усі вихідні точки повинні існувати в цілі (= будь-яка незрівнянна точка - це невідповідність для всього профілю)
Таким чином, ви повинні мати можливість приймати багато ярликів, дискваліфікуючи речі та скорочуючи час на обчислення. Коротко:
- виберіть три точки від джерела
- пошук по цільових точках, знаходження наборів з 3 балів однакової форми
- коли буде знайдено збіг у 3 бали, перевірте всі інші точки в площині, яку вони визначають, щоб побачити, чи вони близькі
- якщо знайдено більше, ніж одна відповідність усіх точок, виберіть одну з найменшою сумою помилки відстаней 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, якщо ви спочатку знайшли центри точок і зберегли їх як набір координат.