E57 "PDF dla chmur punktów" jeden plik w otwartym formacie, który zawiera miliony zmierzonych punktów 3D, ich kolory oraz powiązane z nimi zdjęcia panoramiczne.
Baza wiedzy · formaty plików

E57 bez tajemnic: "PDF dla chmur punktów"

Wyobraź sobie zdjęcie pokoju, które zamiast płaskiego obrazu zapisuje dokładne położenie miliona drobnych punktów na ścianach, krzesłach i kubkach do kawy. Szybko obracający się laser mierzy odległość do każdej powierzchni. Tak powstaje chmura punktów — trójwymiarowe "zdjęcie" złożone ze zmierzonych punktów. Bez technicznego żargonu pokażemy, co kryje plik E57 i jak nasza aplikacja sprytnie wykorzystuje jego dane.

Po co w ogóle osobny format?

Zwykłe zdjęcie to siatka kolorowych pikseli — prosta sprawa. Skan 3D jest bardziej złożony. Dla każdego z milionów punktów trzeba zapisać jego położenie w przestrzeni (trzy liczby: X, Y, Z), kolor, siłę odbitego sygnału lasera (czyli intensywność — coś jak czarno-białe "zdjęcie laserowe"), a często także zdjęcia panoramiczne wykonane w tym samym czasie przez skaner.

Wyobraź sobie, że jedna osoba skanuje urządzeniem Faro, druga używa skanera Leica, a klient otwiera wynik w oprogramowaniu Autodesk. Trzy urządzenia, trzy programy — wszystkie muszą odczytać ten sam plik, nawet po latach, bez proszenia producenta o tajny dekoder. Ten problem rozwiązuje E57: otwarty standard niezależny od producenta, opublikowany jako ASTM E2807 i oparty na bibliotece libE57 o otwartym kodzie źródłowym. Nazywa się go "PDF dla chmur punktów": to jeden przenośny plik, który każdy program odczytuje według tych samych zasad.

Główna idea: tekstowy spis i binarne dane

Plik E57 to połączenie dwóch zupełnie różnych części: niewielkiego fragmentu XML — czytelnego dla człowieka tekstu pełniącego rolę spisu treści — oraz dużych bloków danych binarnych, w których miliony surowych wartości liczbowych są zapisane w zwartej postaci, by można je było szybko odczytać.

Budowa pliku E57 jeden plik = mały nagłówek + duże bloki binarne + tekstowy "spis treści" na końcu Nagłówek 48 bajtów Dane punktów (binarne) miliony punktów (X, Y, Z + kolor) Obrazy (binarne) osadzone panoramy JPEG/PNG Sekcja XML czytelny "spis" całej zawartości początek pliku koniec pliku nagłówek wskazuje dokładne położenie początku spisu XML (xmlPhysicalOffset) Program najpierw odczytuje 48-bajtowy nagłówek, z którego dowiaduje się, że spis zaczyna się od bajtu N. Następnie przechodzi do spisu XML, sprawdza zawartość pliku i od razu trafia do potrzebnego bloku binarnego. Aby znaleźć jeden skan, nie trzeba odczytywać gigabajtów danych — spis zapewnia natychmiastowy dostęp.
Odczyt pliku E57 zaczyna się od 48-bajtowego nagłówka, który wskazuje spis XML na końcu pliku. Spis z kolei podaje położenie każdego bloku binarnego.

Dlaczego spis znajduje się na końcu? Podczas zapisywania pliku skaner nie wie jeszcze, ile miejsca zajmą dane. Najpierw zapisuje więc surowe dane, a po zakończeniu dodaje uporządkowany spis. To znacznie przyspiesza dostęp: aby pobrać jeden skan z pliku o wielkości 20 GB, program odczytuje niewielki nagłówek, przechodzi do spisu XML, znajduje wpis "skan nr 3 zaczyna się od bajtu 4 812 000 000" i od razu przechodzi we wskazane miejsce.

Dyskretny mechanizm ochrony: cały plik jest podzielony na "strony" po 1024 bajty. Ostatnie 4 bajty każdej strony zajmuje suma kontrolna — cyfrowy odcisk, dzięki któremu program może wykryć uszkodzenie pliku.

Wszystko zaczyna się od jednego korzenia

Spis XML ma strukturę drzewa, podobną do folderów na komputerze. Ma jeden korzeń root i dwie główne gałęzie: data3D to numerowana lista skanów, a images2D — numerowana lista zdjęć (zwykle panoram 360° wykonanych przez skaner).

Drzewo E57: wszystko zaczyna się od jednego korzenia sekcja XML ma strukturę drzewa folderów — od korzenia można dotrzeć do dowolnego skanu lub zdjęcia root data3D lista skanów [ scan 0, scan 1, ... ] metadane kto / kiedy układ współrzędnych images2D lista zdjęć [ pano 0, pano 1, ... ] scan 0 punkty + pose scan 1 … points prototype X Y Z · R G B · intensity pose = pozycja i orientacja skanera pozycja (x, y, z) + obrót (kwaternion) każde zdjęcie ma też własną pose, dzięki czemu przeglądarka wie, gdzie je umieścić
Każdy skan i każde zdjęcie mają własną pose — pozycję urządzenia i jego orientację (zapisaną jako kwaternion). Dzięki temu kilka skanów można połączyć w jeden dopasowany model.

Dwa sposoby zapisu punktu

Skaner laserowy nie posługuje się bezpośrednio współrzędnymi X, Y, Z. Stoi w jednym miejscu i obraca się, a dla każdego punktu określa trzy wartości: odległość (jaką przebyła wiązka), azymut (kąt obrotu w poziomie) i kąt elewacji (odchylenie w górę lub w dół). To współrzędne sferyczne — naturalny sposób opisu pomiarów skanera. Większość programów woli jednak kartezjańskie współrzędne X, Y, Z. E57 pozwala zapisać punkty w obu układach, a przeliczenie między nimi wymaga tylko prostych obliczeń trygonometrycznych.

Dwa sposoby zapisu punktu skaner mierzy kąty i odległość — E57 może zapisać punkty na oba sposoby Sferyczne — tak mierzy czujnik skaner punkt odległość azymut (w lewo i w prawo) + kąt elewacji (w górę i w dół) odległość · azymut · kąt elewacji naturalne dla obracającego się skanera laserowego Kartezjańskie — tak przetwarza je program Z X Y punkt X · Y · Z proste współrzędne na siatce, zrozumiałe dla każdego → szybka trygonometria
Punkty są zapisane w zwartej tabeli, którą E57 nazywa CompressedVector: XML definiuje kolumny tylko raz (X, Y, Z, kolor, intensywność...), a blok binarny zawiera kolejne wiersze gęsto upakowanych wartości.

Trzy rodzaje osadzonych zdjęć

Zdjęcia w images2D nie są linkami do plików w osobnym folderze — dane JPEG lub PNG znajdują się bezpośrednio w pliku E57. Istnieje też kilka rodzajów osadzonych zdjęć. Każde z nich E57 zapisuje jako "reprezentację", która informuje program, na ile może polegać na geometrii obrazu. Różnica sprowadza się do jednego pytania: jak dokładnie opisano kamerę?

Trzy sposoby zapisu zdjęcia w E57 jeden plik, trzy "reprezentacje" — różnią się szczegółowością opisu kamery sphericalRepresentation pełna panorama 360° × 180° odwzorowana na sferze Do pomiarów ✓ każdy piksel = określony kierunek względem skanera panorama pokazująca widok dookoła stanowiska, tworzona przez większość skanerów pinholeRepresentation obiektyw płaskie zdjęcie Do pomiarów ✓ zdjęcie wykonane zwykłym obiektywem, w pełni skalibrowane ogniskowa i rozmiar matrycy pozwalają programowi określić kierunek każdego piksela visualReferenceRepresentation tylko obraz Nie do pomiarów ✗ bez modelu aparatu — wyłącznie do oglądania "tak wyglądało to miejsce " — miniatura lub zdjęcie z terenu
Przydatny szczegół: jeden wpis obrazu może zawierać zarówno precyzyjny obraz rastrowy (w odwzorowaniu otworkowym lub sferycznym), jak i zwykłą wersję poglądową. Przeglądarka wyświetla wersję poglądową, a tę nadającą się do pomiarów zachowuje do obliczeń.
  • sphericalRepresentation — pełna panorama 360° × 180°, czyli znany rozciągnięty obraz ekwirektangularny o proporcjach 2:1. Ponieważ odwzorowanie jest znane, każdemu pikselowi odpowiada dokładny kierunek, co pozwala precyzyjnie dopasować obraz do chmury punktów. To główna ścieżka naszego przetwarzania: odczytujemy obraz, nadajemy mu proporcje 2:1 i przekazujemy go do przeglądarki panoram.
  • pinholeRepresentation — zdjęcie wykonane zwykłym obiektywem, opisane klasycznym modelem kamery otworkowej (ogniskowa, rozmiar matrycy, środek optyczny). Dzięki temu program zna kierunek każdego piksela, ale tylko w węższym polu widzenia. W praktyce tak działa przede wszystkim Leica: zapisuje bezpośrednio w pliku E57 gotową mapę sześcienną — sześć płaskich ścian sześcianu skierowanych na zewnątrz. Nasz moduł łączy te ściany w pełną panoramę. To jeden z najprostszych przypadków przekształcenia danych w poprawny obraz 360°.
  • visualReferenceRepresentation — zdjęcie bez żadnego modelu aparatu, przeznaczone wyłącznie do oglądania. Nie można na nim wykonywać pomiarów ani rzutować go na chmurę punktów; służy tylko jako obraz poglądowy. Nasz importer zachowuje takie zdjęcia jako załączone komentarze zamiast umieszczać je w przestrzeni 3D.

Jest jednak pewien haczyk. sphericalRepresentation to popularny wybór, ale zaskakująco łatwo o drobny błąd w jego zastosowaniu. Dlatego ten sam skan może wyglądać inaczej w różnych programach.

  • Przycinanie martwych stref. Każdy skaner ma obszar, którego nie widzi — zwykle bezpośrednio pod sobą, w miejscu, gdzie stoi jego statyw. Niektóre programy eksportujące po prostu przycinają tam panoramę, pozostawiając lukę lub obraz o niestandardowej wysokości.
  • Niekwadratowe piksele. Prawidłowa panorama ma kwadratowe piksele (pixelWidth = pixelHeight). W niektórych plikach tak nie jest, przez co obraz wygląda na rozciągnięty, dopóki nie zostanie przeskalowany.
  • Problemem bywa kierunek "do przodu". Obrót zapisany z panoramą określa, jaki kierunek znajduje się w środku obrazu. Nie ma jednak jednej definicji tego, co oznacza "do przodu" — niektóre programy eksportujące ustawiają tam północ, inne wschód. Drobna pomyłka obraca cały widok.
  • Narzędzia do edycji mogą powodować utratę danych. Na przykład po otwarciu i ponownym zapisaniu pliku E57 w programie CloudCompare może zniknąć pozycja, z której wykonano obrazy pinholeRepresentation — zdjęcia pozostaną, ale bez informacji o miejscu ich wykonania.

W praktyce różne programy często wyświetlają ten sam plik E57 inaczej. Nasz importer próbuje korygować typowe rozbieżności: zmienia skalę niekwadratowych pikseli, poprawia orientację panoramy i ujednolica proporcje obrazu do 2:1. Dzięki temu wirtualny spacer wygląda prawidłowo niezależnie od programu, w którym powstał plik.

Gdy panorama jest zapisana w samej chmurze punktów

To jeden z najbardziej eleganckich — i najmniej docenianych — pomysłów w całym formacie. Panorama nie musi być zapisana jako osobny obraz: może też kryć się w samej chmurze punktów. Skaner laserowy nie wysyła wiązki na chybił trafił — omiata regularną siatkę kierunków, wiersz po wierszu i kolumna po kolumnie, podobnie jak dawny telewizor tworzący obraz na ekranie. E57 pozwala zachować tę kolejność: każdemu punktowi przypisuje rowIndex i columnIndex, które wskazują jego komórkę w siatce. Zapisany w ten sposób skan nazywa się uporządkowanym.

Gdy panorama jest zapisana w chmurze punktów skan "uporządkowany" zapisuje punkty w siatce — chmura jest więc już obrazem skan w zapisanej postaci: wiersze × kolumny kolumna → azymut (0°-360° wokół) wiersz → kąt pionowy (góra-dół) niebo: wiązka lasera w nic nie trafiła fikcyjne punkty zastępcze (odległość = 0 / "brak odbicia") ↓ odczytaj siatkę kolejno = piksele → panorama 2:1 od razu, bez ponownego rzutowania szerokość siatki (columnMaximum + 1) = szerokość panoramy Ponieważ każdy punkt ma przypisane wartości rowIndex i columnIndex, obraz i geometria 3D są jednym i tym samym. Fikcyjne punkty w obszarze nieba pozwalają zachować idealnie prostokątną siatkę — program wie, że należy je pominąć.
W skanie uporządkowanym chmura punktów i panorama są jednym i tym samym — obraz nie jest osobnym zdjęciem, lecz wynika z samego układu punktów.

Korzyść jest prosta: jeśli punkty leżą na siatce, chmura jest już obrazem. Wystarczy odczytać ją wiersz po wierszu, a każdy punkt trafi na piksel — panorama powstanie bez ponownego rzutowania. Plik zawiera też rozmiar siatki w indexBounds (columnMaximum, rowMaximum), więc program zna rozdzielczość z góry. Nasz moduł tworzący panoramę wyznacza szerokość obrazu bezpośrednio z columnMaximum + 1.

Siatka musi jednak tworzyć idealny prostokąt, a skanowany świat nie jest tak regularny. Co z kierunkami, w których wiązka pobiegła w otwarte niebo i nie wróciło żadne odbicie? Rozwiązanie jest proste: wypełnić te komórki fikcyjnymi punktami — często o odległości równej dokładnie 0, co oznacza "wysłano wiązkę, ale w nic nie trafiła". Dzięki nim siatka pozostaje prostokątna, lecz punkty te nie reprezentują rzeczywistej geometrii i trzeba je pomijać. Nasz importer oznacza każdy punkt o zerowej odległości i przypisuje mu umowną dużą odległość, aby obliczenia na siatce nadal działały. Przy tworzeniu mapy głębi i eksportowaniu chmury punktów nigdy nie traktuje tych fikcyjnych punktów nieba jako rzeczywistych powierzchni.

Jak zamienić skan w panoramę, którą możesz oglądać od środka

Nie każdy skan ma gotową siatkę — niektóre są po prostu nieuporządkowanymi zbiorami punktów. Dobra wiadomość: panoramę nadal można odtworzyć i właśnie tu zaczyna się nasza praca. Skan to w istocie "pełna sfera punktów zmierzonych pod różnymi kątami z jednego stanowiska", którą można rozwinąć w płaską panoramę.

Od chmury punktów do zdjęcia, w którym można się rozglądać na tym polega pomysł tego projektu: rozwinąć sferę punktów w płaską panoramę 1 · skan otacza Cię ze wszystkich stron każdy punkt ma położenie kątowe względem środka → rozwiń 2 · kąty wyznaczają położenie na płaskiej siatce góra ↕ dół ← pełne 360° od lewej do prawej → → wypełnij luki 3 · trzy obrazy panorama barwna intensywność (cz.-b.) mapa głębi Chmura punktów kryje w sobie panoramę — po odwzorowaniu punktów według kątów powstaje płaski obraz o proporcjach 2:1. Kolor wypełnia piksele, intensywność odbicia lasera daje wyraźny obraz w odcieniach szarości, a odległość tworzy mapę głębi.
Jedna chmura punktów, trzy obrazy: kolor wypełnia piksele, intensywność odbicia lasera daje wyraźny, pozbawiony cieni obraz w odcieniach szarości, a odległość tworzy mapę głębi. Dzięki niej płaska panorama pozwala mierzyć odległości i przemieszczać się po skanowanej przestrzeni.

Każdemu punktowi przypisz piksel na podstawie jego położenia kątowego — od lewej do prawej wzdłuż szerokości obrazu i od góry do dołu wzdłuż jego wysokości. Tak powstaje rozciągnięta panorama ekwirektangularna o proporcjach 2:1. Kluczowa jest mapa głębi: gdy z każdym pikselem powiązana jest odległość, panorama wyglądająca na płaską pozwala wykonywać pomiary i przemieszczać się po skanowanej przestrzeni. Kliknij dwa punkty na ścianie, a program obliczy rzeczywistą odległość między nimi, ponieważ zachowuje dane 3D, na których opiera się panorama.

Dlaczego więc E57 jest ważny?

Bo pozwala wymieniać dane niezależnie od producenta. Geodeta skanuje most sprzętem jednej marki, inżynier otwiera dane w innym programie, a architekt archiwizuje je na kolejne dwadzieścia lat. Wszyscy mogą polegać na tym samym pliku E57, bez uzależnienia od jednego dostawcy. Ten otwarty standard, który każdy może wdrożyć, przechowuje w jednym pliku kolory, intensywność odbicia lasera, geometrię, panoramy i niezwykle ważne pozycje czujników.

Na koniec ciekawostka: czas wykonania skanu zapisany w pliku E57 jest podawany jako czas GPS — liczba sekund od 6 stycznia 1980 roku, kiedy rozpoczęto jego odmierzanie — a nie od roku 1970, jak zwykle w komputerach. Jeśli pomylisz te sposoby liczenia czasu, skan wykonany dziś będzie wyglądał na wykonany w 2013 roku.

Chcesz dowiedzieć się więcej?

  • libE57.org — referencyjna biblioteka o otwartym kodzie źródłowym i główna strona formatu
  • ASTM E2807 — oficjalna specyfikacja
  • libE57Format · Image2D — dokładne definicje reprezentacji sferycznej, reprezentacji kamery otworkowej i reprezentacji odniesienia wizualnego
  • Paul Bourke’s E57 notes — zwięzły opis techniczny nagłówka i struktury pliku
Asystent AI
Cześć! Zapytaj mnie o wirtualne spacery, chmury punktów, 3D Gaussian Splatting, modele 3D, korzystanie z serwisu, płatności i nie tylko. Znajdę odpowiedź lub przekażę Twoje pytanie do pomocy technicznej.
Nasza sztuczna inteligencja nie zdołała odpowiedzieć na Twoje pytanie. Pomoc techniczna chętnie odpowie na Twoje pytanie. Podaj swój adres e-mail. Nie wykorzystujemy Twojego adresu e-mail do wysyłania newsletterów. Posłuży nam wyłącznie do udzielenia odpowiedzi na Twoje pytanie.