Chmura punktów jest generowany za pomocą równomiernego rozkładu funkcję (x,y,z)
. Jak pokazano na poniższym rysunku, badana jest płaska przecinająca się płaszczyzna ( profil ), która pasuje jako najlepszy (nawet jeśli nie dokładny) profil docelowy, tj. Podany w lewym dolnym rogu. Więc pytanie brzmi:
1- Jak znaleźć taki mecz podane
target 2D point map
przezpoint cloud
rozważenie następujących Uwagi / warunki?
2- Jakie są zatem współrzędne / orientacje / stopień podobieństwa itp.?
Uwaga 1: Profil zainteresowania może być w dowolnym miejscu z dowolnym obrotem wzdłuż osi, a także może mieć inny kształt, np. Trójkąt, prostokąt, czworokąt itp., W zależności od jego położenia i orientacji. Na poniższej demonstracji pokazano tylko prosty prostokąt.
Uwaga 2: Wartość tolerancji można uznać za odległość punktów od profilu. Aby to wykazać na poniższym rysunku, załóżmy tolerancję 0.01
razy najmniejszy wymiar (~1)
tak tol=0.01
. Jeśli więc usuniemy resztę i rzutujemy wszystkie pozostałe punkty na płaszczyznę badanego profilu, będziemy mogli sprawdzić jego podobieństwo do profilu docelowego.
Uwaga 3: Temat pokrewny można znaleźć w Rozpoznawaniu wzorców punktowych .
Python
+MatPlotLib
do przeprowadzania badań i generowania wykresów itp.P:{x,y,z}
. Rzeczywiście są to punkty bezwymiarowe. Jednak z pewnym przybliżeniem można je zdyskretyzować do wymiaru jednopikselowego jako tablice 3D. Mogą zawierać także inne atrybuty (takie jak ciężary itp.) Względem współrzędnych.Odpowiedzi:
To zawsze będzie wymagało dużo obliczeń, szczególnie jeśli chcesz przetworzyć aż 2000 punktów. Jestem pewien, że istnieją już wysoce zoptymalizowane rozwiązania dla tego rodzaju dopasowywania wzorców, ale musisz dowiedzieć się, jak to się nazywa, aby je znaleźć.
Ponieważ mówisz o chmurze punktów (rzadkich danych) zamiast obrazu, moja metoda korelacji krzyżowej tak naprawdę nie ma zastosowania (i byłaby jeszcze gorsza obliczeniowo). Coś w rodzaju RANSAC prawdopodobnie szybko znajdzie dopasowanie, ale niewiele o nim wiem.
Moja próba rozwiązania:
Założenia:
Powinieneś być w stanie wziąć wiele skrótów, dyskwalifikując rzeczy i skracając czas obliczeń. W skrócie:
Bardziej szczegółowe:
Która konfiguracja ma błąd najmniejszych kwadratów dla wszystkich innych punktów, najlepiej pasuje
Ponieważ pracujemy z 3 punktami testowymi najbliższego sąsiada, dopasowanie punktów docelowych można uprościć, sprawdzając, czy znajdują się w promieniu. Na przykład szukając promienia 1 z (0, 0), możemy zdyskwalifikować (2, 0) na podstawie x1 - x2, bez obliczania rzeczywistej odległości euklidesowej, aby ją nieco przyspieszyć. Zakłada się, że odejmowanie jest szybsze niż mnożenie. Istnieją również zoptymalizowane wyszukiwania oparte na bardziej dowolnym stałym promieniu .
Właściwie, ponieważ i tak będziesz musiał obliczyć wszystkie, bez względu na to, czy znajdziesz dopasowania, czy nie, a ponieważ w tym kroku zależy ci tylko na najbliższych sąsiadach, jeśli masz pamięć, prawdopodobnie lepiej jest wstępnie obliczyć te wartości przy użyciu zoptymalizowanego algorytmu . Coś w rodzaju triangulacji Delaunaya lub Pittewaya , w której każdy punkt celu jest połączony z najbliższymi sąsiadami. Przechowuj je w tabeli, a następnie poszukaj ich dla każdego punktu, próbując dopasować trójkąt źródłowy do jednego z trójkątów docelowych.
W grę wchodzi wiele obliczeń, ale powinna być stosunkowo szybka, ponieważ działa tylko na danych, które są rzadkie, zamiast mnożenia wielu zerowych znaczeń zerowych, takich jak korelacja krzyżowa danych wolumetrycznych. Ten sam pomysł zadziałałby w przypadku 2D, gdybyś najpierw znalazł środki kropek i zapisał je jako zbiór współrzędnych.
źródło
Fortran
liczbach wyższych niż500
punkty nie będzie można mieć doświadczenia z komputerem.Dodałbym opis @ mirror2image do alternatywnego rozwiązania obok RANSAC, możesz rozważyć algorytm ICP (iteracyjny najbliższy punkt), opis można znaleźć tutaj !
Myślę, że następnym wyzwaniem przy korzystaniu z tego ICP jest zdefiniowanie własnej funkcji kosztu i początkowej pozycji płaszczyzny docelowej w odniesieniu do danych punktu chmurowego 3D. Pewnym praktycznym podejściem jest wprowadzenie losowego szumu w danych podczas iteracji, aby uniknąć zbieżności z fałszywymi minimami. To heurystyczna część, którą chyba trzeba zaprojektować.
Aktualizacja:
Kroki w formie uproszczonej to:
Powtórz krok 1-4.
Dostępna jest biblioteka, którą możesz rozważyć tutaj ! (Jeszcze tego nie próbowałem), w części dotyczącej rejestracji jest jedna sekcja (w tym inne metody).
źródło