2016-04-08 12 views
10

Używanie Emgu CV Wyodrębniłem zestaw zamkniętych wielokątów z konturów na obrazie sieci dróg. Wielokąty przedstawiają kontury dróg. Wynik jest pokazany poniżej, wykreślony na mapie OpenStreetMaps (wielokąty w postaci "piksela" z Emgu CV zostały skonwertowane do postaci szerokości/długości geograficznej do wykreślenia).Wykres Voronoi z zestawu wielokątów w Emgu CV (lub OpenCV)

Zestaw wielokątów reprezentujących drogi nakreśla:

enter image description here

Chciałbym teraz obliczyć diagramu Voronoi tego zestawu wielokątów, które pomogą mi znaleźć środkowej drogi. Ale w Emgu CV mogę znaleźć tylko sposób na zdobycie diagramu Voronoi zestawu punktów. Odbywa się to poprzez znalezienie triangulacji Delaunaya zestawu punktów (przy użyciu klasy Subdiv2D), a następnie obliczenia aspektów voronoi za pomocą GetVoronoiFacets.

Próbowałem computing diagramu Voronoi z punktów zdefiniowanych przez wszystkich wielokątów w zestawie (każdy wielokąt jest lista punktów), ale to daje mi niezwykle skomplikowany diagram Voronoi, jak można by się spodziewać:

Woronoja schemat zbioru punktów:

enter image description here

obraz ten pokazuje mniejszą część pierwszego obrazu (dla jasności, ponieważ jest tak zwinięty). Rzeczywiście niektóre linie na diagramie wydają się reprezentować linię środkową drogi, ale jest tak wiele innych linii, że trudno będzie znaleźć kryterium do wydobycia "dobrych" linii.

Innym potencjalnym problemem, przed którym stoję, jest to, że, jak powinieneś być w stanie powiedzieć z pierwszego obrazu, niektóre wielokąty znajdują się we wnętrzu innych, więc nie znajdujemy się w standardowej sytuacji zestawu rozłącznego zamknięte wielokąty. Oznacza to, że czasami droga znajduje się między zewnętrzną granicą jednego wielokąta a wewnętrzną granicą innej.

Szukam wskazówek, jak obliczyć wykres Voronoi z zestawu wielokątów za pomocą Emgu CV (lub Open CV), miejmy nadzieję, że przezwycięży ten drugi problem, który również opisałem. Jestem również otwarty na inne sugestie, jak to osiągnąć bez korzystania z Emgu CV.

+0

Musisz więc obliczyć "centrum" ulic zaczynając od 1) obrazu, używając _pixel form_ (easy) lub 2) używając współrzędnych punktów lat, lng? Dla 1) możesz narysować wypełnione wielokąty i użyć transformacji odległości. Środek ulic będzie miał maksymalną wartość odległości. Tłumienie niemaksujące daje wynik – Miki

+0

Z obrazu jest to, czego potrzebuję. Używanie transformacji odległości to świetny pomysł, dziękuję. W rzeczywistości mogę zastosować przekształcenie odległości do mojego oryginalnego obrazu binarnego, czyli tam, gdzie początkowo obliczyłem wielokąty, odszukując kontury! To świetnie, bo wtedy nie muszę zajmować się problemem wielokątów zawierających inne wielokąty. Czy możesz mi pomóc z supremacją bez maksimum - jak to osiągnąć w Emgu CV? Najbliższe, jakie mogę znaleźć, to wyszukiwanie krawędzi Harrisa. – mchristos

+0

To powiedziawszy, końcowy wynik, którego potrzebuję, to wykres lat/longów, które reprezentują linię środkową drogi ... co mogę z zasady znaleźć w pikselach linii środkowej, ale być może nie jest to najlepsze podejście. Być może wykres Voronoi jest nadal lepszym podejściem. – mchristos

Odpowiedz

0

Jeśli masz już wielokątów, możesz spróbować obliczenia Straight Skeleton.

Nie próbowałem go, ale CGAL ma implementation. Zauważ, że ta konkretna funkcja to license, to GPL.

Możliwe problem może być:

Aktualna wersja pakietu CGAL może jedynie skonstruować prosty szkielet w wnętrze prostego wielokąta z otworami, które jest nie obsługuje ogólnie wielokątnym postacie w samolocie.

Prawdopodobnie istnieją rozwiązania tego problemu. Na przykład możesz uwzględnić wszystkie wielokąty w większym prostokącie (w ten sposób oryginalne wielokąty będą dziurami nowego prostokąta). To może nie działać dobrze, jeśli oryginalne wielokąty mają dziury.Aby rozwiązać ten problem, można wykonać algorytm dla każdego wielokąta z otworami, a następnie umieścić wszystkie wielokąty w prostokącie, usuwając wszystkie dziury i ponownie wykonać algorytm.

Powiązane problemy