CCTVPLANNER.IO / RESEARCH

    Geometria pokrycia kamery CCTV

    Jak pochylona, zamontowana kamera odwzorowuje grunt — geometria frustum, projekcje obiektywów i standard DORI, wyprowadzone od podstaw i zilustrowane tym samym kodem, który napędza działający designer.

    1. Od frustum do śladu na gruncie

    Kamera otworkowa (pinhole) definiuje frustum widzenia (ostrosłup widzenia): czworościenną piramidę rozciągającą się od centrum optycznego kamery do granic płaszczyzny obrazu. Każdy piksel jest jednym promieniem biegnącym z centrum optycznego przez odpowiadający mu punkt na płaszczyźnie obrazu. Aby ustalić, jaki obszar gruntu kamera obejmuje, przecinamy każdy promień z płaszczyzną gruntu i zachowujemy punkty mieszczące się w zasięgu kamery.

    Dla kamery zamontowanej na wysokości h, pochylonej o kąt α poniżej poziomu, z pionowym polem widzenia vfov, cztery promienie narożne frustum tworzą zewnętrzną obwiednię pokrycia na gruncie. W typowych konfiguracjach montażowych (gdy α + vfov/2 < 90°) kształt jest obciętym trapezoidem z zakrzywionymi narożnikami — nie trójkątem ani sektorem wychodzącym z punktu montażu kamery. Gdy α + vfov/2 zbliża się do 90° (bardzo strome kamery sufitowe typu dome), dolna krawędź obrazu zaczyna trafiać w grunt tuż przy podstawie kamery i trapezoid degeneruje się w kierunku sektora.

    h = 4 m · tilt = 30° · hfov = 106° · vfov = 70° · range = 25 mokrąg zasięgu (25 m)

    Widok z góry śladu na gruncie dla kamery h = 4 m, pochylenie = 30°, hfov = 106°. Dolna krawędź obrazu spotyka grunt w niewielkiej odległości przed kamerą; krawędzie boczne rozchodzą się; krawędź daleka jest ograniczona efektywnym zasięgiem kamery.

    2. Przecięcie krawędzi dolnej i górnej

    Promień dolnej krawędzi (sV = −1 we współrzędnych płaszczyzny obrazu) trafia w grunt na odległości:

    d_near = h / tan(α + vfov/2)

    Promień górnej krawędzi (sV = +1) trafia na:

    d_far = h / tan(α − vfov/2)            jeśli α > vfov/2  (cała w dół poniżej horyzontu)
            nieograniczone                  jeśli α ≤ vfov/2  (górna krawędź nad horyzontem
                                                              — ograniczona renderRange)
    h = 4 mkamera (h = 4 m)martwa 0 – 4.8 md_near = 4.8 mrenderRange = 10 mh = 4 m · tilt α = 15° · vfov = 50°

    Widok z boku, h = 4 m, pochylenie = 15°, vfov = 50°. Dwie niebieskie linie to promienie dolnej i górnej krawędzi frustum; gruby niebieski pasek na gruncie oznacza obszar, który kamera odwzorowuje na podłodze (od d_near do renderRange). Czerwony klin pod masztem to geometryczna strefa, której obiektyw nie może rozdzielić.

    Dla krawędzi bocznych (sH = ±1) ta sama konstrukcja stosuje się w płaszczyźnie poziomej: każdy boczny promień przemiata HFOV kamery na każdej wysokości płaszczyzny obrazu. Dla obiektywów rektylinearnych (dominujących w CCTV) promienie te rzutują się na grunt jako rozbieżne linie proste, tworząc skośne boki trapezoidu. Dla obiektywów fisheye to samo odwzorowanie jest zakrzywione i ślad na gruncie staje się zakrzywionym dyskiem.

    3. Geometryczna martwa strefa

    Dla każdej kamery zamontowanej nad gruntem i pochylonej o mniej niż 90° − vfov/2 istnieje obszar bezpośrednio pod montażem, do którego nie dotrze żaden promień frustum. Dolna krawędź obrazu skierowana jest pod kątem α + vfov/2 poniżej poziomu; wszystko bliżej niż d_near jest poza obrazem kamery.

    Przy stałym pochyleniu i FOV martwa strefa skaluje się liniowo z wysokością montażu — wzór redukuje się do d_near = h × cot(α + vfov/2), gdzie człon kotangensa jest stały dla danego obiektywu. Kamera pochylona o 15° z pionowym FOV 50° ma martwą strefę 4,8 m przy montażu na 4 m i 23,8 m przy montażu na 20 m — stosunek 5×, identyczny ze stosunkiem wysokości. Stosunek martwej powierzchni do powierzchni pokrycia jest dominującym ograniczeniem przy montażu kamer na wysokich masztach.

    h = 20 mkamera (h = 20 m)martwa 0 – 23.8 md_near = 23.8 mrenderRange = 50 mh = 20 m · tilt α = 15° · vfov = 50°

    Ten sam obiektyw, to samo pochylenie 15°, tylko zamontowany wyżej (h = 20 m): martwa strefa rośnie proporcjonalnie do wysokości, niezależnie od ogniskowej i sensora.

    4. Zasięgi DORI (EN 62676-4)

    Standard DORI (Wykrycie / Obserwacja / Rozpoznanie / Identyfikacja) definiuje docelowe gęstości pikseli na cel w określonych zasięgach od kamery. Zgodnie z EN 62676-4 te zasięgi to odległości poziome na gruncie między kamerą a celem — nie odległości ukośne wzdłuż osi optycznej. Karty katalogowe głównych producentów (Axis, Hikvision, Dahua, Bosch) trzymają się tej konwencji.

    Na mapie 2D cztery progi DORI to po prostu współśrodkowe łuki o promieniach równych odpowiednim odległościom poziomym, przycinane przez wielokąt śladu kamery. Tam, gdzie ślad nie sięga danego promienia, odpowiadająca część łuku jest niewidoczna — dla kamer o wąskim HFOV stożek jest zbyt cienki, by zmieścić cały okrąg, więc boczne końce każdego progu są obcinane, a dla kamer o krótkim zasięgu większe progi w ogóle wypadają poza stożek.

    Identyfikacja → 8 mRozpoznanie → 16 mObserwacja → 32 mWykrycie → 64 mh = 4 m · tilt = 20° · hfov = 90° · range = 70 mKażdy łuk = odległość pozioma od kamery dla danego progu (EN 62676-4)

    Łuki DORI jako odcinki na gruncie wewnątrz śladu kamery. h = 4 m, pochylenie = 20°, hfov = 90°, zasięg = 70 m. Wartości progów (8 / 16 / 32 / 64 m) są ilustracyjne dla typowej kamery 1080p przy ~90° HFOV; rzeczywiste odległości poziome zależą od sensora i ogniskowej. EN 62676-4 określa gęstości pikseli na każdym progu (Identyfikacja: 250 px/m, Rozpoznanie: 125 px/m, Obserwacja: 62 px/m, Wykrycie: 25 px/m), z których wyprowadza się odległości poziome dla konkretnej kamery.

    Interpretacja jako odległość ukośna (gdy ma zastosowanie). Jeśli konkretna karta katalogowa podaje zasięg jako odległość ukośną od obiektywu — rzadkość w typowej optyce CCTV, spotykane czasem w specyfikacjach termowizji lub teleobiektywów — odpowiadająca odległość pozioma na gruncie wynosi √(d_slant² − h²). Kamera zamontowana na 6 m z 8-metrowym zasięgiem ukośnym Identyfikacji obejmuje 5,3 m promienia poziomego (√(64 − 36)). Moduł geometrii udostępnia obie formy; diagram na tej stronie używa standardowej interpretacji poziomej.

    5. Typy projekcji obiektywu

    Różne konstrukcje obiektywów odwzorowują kąt od osi optycznej na promień w płaszczyźnie obrazu w różny sposób. W CCTV używa się trzech projekcji:

    Projekcjar(θ)Typowy zakres
    Rektylinearnaf · tan θHFOV ≲ 120° (większość obiektywów stałoogniskowych i waryskupowych)
    Ekwidystansowaf · θHFOV ≳ 140° (panoramiczne / fisheye)
    Ekwisolidna2 f · sin(θ/2)Obiektywy fisheye zachowujące kąt bryłowy

    θ = kąt od osi optycznej (w radianach); f = ogniskowa. r(θ) to odległość promieniowa na płaszczyźnie obrazu od punktu głównego.

    Dla obiektywów rektylinearnych pozaosiowy współczynnik boczny tan(θ) przekracza 1 gdy θ przechodzi 45° od osi optycznej (czyli gdy HFOV przekracza 90°) i rośnie nieograniczenie gdy θ zbliża się do 90° (HFOV zbliżający się do 180°). W rzeczywistej optyce rozciągnięcie narożników staje się znaczące długo przed matematyczną rozbieżnością — większość projektantów obiektywów przechodzi na konstrukcje quasi-fisheye przy 120–140° HFOV, a pełne obiektywy fisheye stosuje się powyżej ~170°.

    CCTVplanner.io aktualnie używa projekcji rektylinearnej do 170° HFOV; powyżej tego progu rozciągnięcie narożników staje się wystarczająco duże, by ze względu na stabilność numeryczną przełączyć się na ekwidystansową. Kamery z HFOV w przedziale ~140°–170° są zatem modelowane matematyką rektylinearną, nawet jeśli ich rzeczywisty obiektyw jest bliższy fisheye — akceptujemy to w zamian za prostszą geometrię narożników. Projekcja ekwisolidna jest obsługiwana w warstwie geometrii (dla danych producenta, które ją jawnie określają), ale nie ma jeszcze dla niej przełącznika w interfejsie użytkownika.

    Pułapka kart katalogowych: HFOV vs DFOV

    Wielu producentów — szczególnie czołowe marki azjatyckie (Dahua, Hikvision, Uniview, Tiandy) — podaje na karcie katalogowej pojedynczą wartość pola widzenia, która w rzeczywistości jest diagonalnym polem widzenia (DFOV), a nie poziomym. Wpisanie wartości DFOV do narzędzia oczekującego HFOV daje ślad zbyt szeroki o 10–15%, z błędem skoncentrowanym na bocznych krawędziach, gdzie gęstość pikseli liczy się najbardziej.

    Dla sensora o stosunku boków poziomy:pionowy a (np. 16:9 → a = 16/9), konwersja wygląda następująco:

    tan(HFOV/2) = tan(DFOV/2) × a / √(a² + 1)
    tan(VFOV/2) = tan(DFOV/2) × 1 / √(a² + 1)

    Odwzorowanie jest nieliniowe w kącie: kuszące skróty liniowe postaci HFOV ≈ k × DFOV działają dla wąskich obiektywów, ale zawodzą dramatycznie przy szerszych polach widzenia. Dla sensora 16:9 dokładne wartości to:

    DFOV (16:9)Dokładny HFOVDokładny VFOVBłąd skrótu liniowego
    60°53,4°31,6°−1,1°
    80°72,4°44,7°−2,6°
    100°92,2°60,6°−5,0°
    120°113,0°80,7°−8,4°
    140°134,7°106,8°−12,7°

    "Błąd skrótu liniowego" = HFOV z naiwnego wzoru HFOV = (a / √(a²+1)) × DFOV minus wartość dokładna. Skrót zaniża HFOV o 5–13° w zakresie szerokokątnym dominującym w nowoczesnej optyce CCTV — znacznie więcej niż założona w §9 tolerancja ±1° z karty katalogowej. Zawsze używaj wzoru opartego na tangensie lub dokładnych wartości powyżej.

    Baza kamer CCTVplanner.io przechowuje HFOV (kanoniczna miara CCTV) i konwertuje przy imporcie kamer, których karty katalogowe podają tylko DFOV. Przy ręcznym wpisywaniu kamery sprawdź jednostki przed wpisaniem liczby do pola HFOV — pomyłka w tym miejscu jest jednym z dwóch najczęstszych powodów, dla których wyniki wizji lokalnej nie zgadzają się z rzeczywistym zainstalowanym pokryciem (drugim jest stosunek boków sensora).

    6. Przeszkody, cienie i widoczny ślad

    Ściany, ogrodzenia i wysokie konstrukcje blokują promienie kamery. Aby obliczyć widoczny ślad, modelujemy każdą nieprzepuszczalną przeszkodę jako wielokąt (zamknięty obwód) lub łamaną (otwarte ogrodzenie) i dla każdego segmentu rzutujemy czworokąt cienia: każdy segment jest rozciągany w kierunku oddalającym się od kamery na kilkukrotność zasięgu rendera. Suma tych cieni segmentowych to sylwetka przeszkody plus wszystko, co znajduje się za nią z perspektywy kamery.

    Widoczny ślad to wówczas ślad − ⋃ cieni, obliczany algorytmem różnicy wielokątów Martíneza–Ruedy. Wynikiem jest wielokąt (lub lista rozłącznych wielokątów, gdy przeszkoda dzieli stożek), którego krawędzie idealnie pokrywają się zarówno z dalekim łukiem frustum, jak i z każdą blokującą ścianą.

    W analizie 3D-aware przeszkoda niższa niż wysokość montażu kamery nie blokuje promienia całkowicie — rzuca skończony cień na gruncie rozciągający się za przeszkodą. Dla ściany w poziomej odległości d od kamery, przy wysokości montażu h_cam i wysokości szczytu przeszkody h_obs, cień rozciąga się od ściany do poziomej odległości:

    d_shadow_end = d × h_cam / (h_cam − h_obs)            dla h_cam > h_obs
    
    Dla h_obs ≥ h_cam przeszkoda blokuje linię widzenia
    całkowicie — odpowiednik nieskończonego cienia. Designer
    traktuje ten przypadek jako w pełni nieprzezroczysty
    blocker (brak widoczności ponad) i stosuje to samo
    rzutowanie cienia segmentowego, co w trasie 2D obstacle-clipping.

    Włączenie opcji "Use vertical height (3D)" na budynku lub ogrodzeniu w designerze przełącza go na ten model rzutowania cienia. Gdy kamera jest niższa od przeszkody (lub równa wysokością), przełącznik nie ma efektu.

    7. Projekcja wielopiętrowa

    Przecięcie frustum z gruntem uogólnia się w sposób trywialny do dowolnej płaszczyzny poziomej. Zastąp równanie podłogi z = 0 przez z = z_target, rozwiąż to samo równanie ray-plane dla każdego promienia narożnego, a wynikiem jest ślad kamery na danym piętrze docelowym. Kamera zamontowana na drugim piętrze atrium pokrywa parter w tej samej konstrukcji co kamera zamontowana przy gruncie pokrywa swoje własne piętro, tylko z inną wartością z_target i zmodyfikowanym pionowym przesunięciem między kamerą a płaszczyzną docelową.

    Warstwa matematyczna projekcji wielopiętrowej jest dostępna w module geometrii już dziś; interfejs wyboru piętra i podgląd sceny Three.js są zaplanowane na kolejne wydanie.

    8. Założenia i ograniczenia

    Każdy wzór powyżej opiera się na zestawie założeń upraszczających. Obowiązują one dla większości scenariuszy CCTV ze stałym montażem, ale zawodzą w określonych warunkach; dokumentujemy je, aby praktyk mógł zdecydować, kiedy ufać modelowi.

    Założenia modelu

    • Płaski grunt (podłoga to płaszczyzna z = 0) — bez nachylenia terenu, bez krzywizny Ziemi.
    • Kamera statyczna w momencie ujęcia — bez ruchu PTZ podczas klatki, bez wibracji.
    • Model kamery otworkowej (pinhole) — bez dystorsji obiektywu. Rzeczywiste obiektywy wprowadzają dystorsję radialną i tangencjalną Browna–Conrady'ego (współczynniki k₁, k₂, p₁, p₂), której nie modelujemy.
    • Idealna kalibracja — rozstaw pikseli sensora, ogniskowa i centrum optyczne dokładnie odpowiadają specyfikacji producenta.
    • Brak artefaktów rolling shutter; cały obraz jest ujmowany w jednej chwili.
    • Brak rotacji wokół osi optycznej (roll) — oś optyczna jest obrócona tylko przez pan i tilt; sensor pozostaje poziomy.
    • Pojedyncza ścieżka optyczna — bez refrakcji szklanej kopuły, bez powierzchni odbijających w scenie.
    • Refrakcja atmosferyczna jest pomijalna w typowych zasięgach CCTV (błąd poniżej 1 cm na 50 m).

    Kiedy model się załamuje

    • Nachylony teren. Ślad na gruncie przesuwa się asymetrycznie: strona w dół zbocza rozciąga się dalej niż przewiduje model, strona w górę zbocza kompresuje się. Błąd to z grubsza ±h · tan(slope) na metr odległości poziomej.
    • Dystorsja obiektywów szerokokątnych. Powyżej ~110° HFOV projekcja rektylinearna odbiega od rzeczywistego odwzorowania obiektywu o 1–5% w narożnikach. Projekcje ekwidystansowa / ekwisolidna są dostępne w warstwie geometrii dla tych przypadków (patrz §5).
    • Kamery z kopułą szklaną. Kopuła wprowadza niewielkie przesunięcie refrakcyjne na wejściu obiektywu (milimetry przy typowych wysokościach montażu). Dla wysokoprecyzyjnej pracy z DORI na instalacjach z lustrzanym szkłem staje się to nietrywialne; dla ogólnego planowania mieści się poniżej innych źródeł błędu.
    • Optyka wielokrotnego odbicia. Odbicia od szklanych ścian, lustrzanych sufitów lub wypolerowanych podłóg nie są śledzone. Model zwraca tylko ślad w linii bezpośredniej widzenia.
    • PTZ w ruchu. Model daje chwilowy ślad przy jednym ustawieniu pan/tilt. Pokrycie ruchomego PTZ w czasie to zamiatany ślad, nie chwilowy.
    • Tolerancja montażu. Rzeczywiste kąty instalacji odchylają się od projektu o 1–3° (błąd technika). Następna sekcja kwantyfikuje, jak to przekłada się na błąd na gruncie.

    9. Wrażliwość na błędy

    Błędy parametrów wejściowych (wysokość montażu, kąt pochylenia, FOV) propagują się na błędy położenia w śladzie na gruncie. Dla przecięcia dolnej krawędzi z gruntem d_near = h / tan(α + vfov/2) pochodne cząstkowe dają:

    ∂d_near/∂h = 1 / tan(α + vfov/2)        = d_near / h
    ∂d_near/∂α = −h / sin²(α + vfov/2)         (radiany)
    ∂d_near/∂vfov = −h / (2 · sin²(α + vfov/2)) (radiany)

    Pochodne kątowe są w radianach; pomnóż przez π/180 (≈ 0,01745), aby przekonwertować na stopień. Tabela poniżej stosuje tę konwersję.

    Dla typowej konfiguracji (h = 10 m, pochylenie = 15°, vfov = 50° → d_near ≈ 11,9 m) niewielkie błędy każdego parametru produkują następujące odchylenia d_near:

    ParametrBłąd wejściowyΔ d_nearUwaga
    pochylenie α±1°±0,42 mtypowa rozdzielczość inklinometru
    pochylenie α±3°±1,27 mmontaż „na oko" na uchwycie
    wysokość h±0,5 m±0,59 mpomiar taśmą, niedostępny maszt
    vfov±1°±0,21 mzaokrąglenie w karcie katalogowej
    razemRMS~1,4 mprzy 3° pochylenie + 0,5 m wysokość + 1° fov

    Dominującym członem jest niepewność kąta instalacji: w powyższej konfiguracji każdy stopień błędu pochylenia kosztuje ~42 cm dokładności pozycji na gruncie przy d_near. Inklinometr laserowy o rozdzielczości 0,1° utrzymuje błąd d_near związany z pochyleniem poniżej 5 cm; instalacja „na oko" na uchwycie ma dokładność rzędu ±1 m. Do weryfikacji progów DORI (gdzie różnica między pierścieniem Rozpoznania a Identyfikacji może wynosić 2–3 m), pochylenie powinno być zmierzone, nie szacowane.

    Ta sama analiza pochodnych cząstkowych ma zastosowanie do bocznej szerokości śladu przez HFOV — błąd 1° HFOV daje w przybliżeniu 2 · d · tan(½°) ≈ 1,7% błędu rozproszenia bocznego na odległości d. Przy zasięgu 30 m to ~52 cm bocznej niepewności, dlatego wartości HFOV producenta traktujemy jako ±1°, a nie dokładne.

    10. Reprodukowalność

    Wszystkie wzory w tym artykule są zaimplementowane dosłownie w module geometrii dostarczanym z designerem CCTVplanner.io. Moduł jest pokryty kompleksowym zestawem testów jednostkowych obejmujących projekcje rektylinearną / ekwidystansową / ekwisolidną, brzegowe przypadki martwej strefy, projekcję DORI na grunt, klipping przeszkód operacjami boolowskimi na wielokątach oraz rozszerzenie wielopiętrowe. Każdy diagram na tej stronie jest renderowany przez wywołanie tych samych funkcji, których używa działający designer.

    Kluczowe punkty wejścia

    • buildFrustum(args) — baza kamery (forward / right / upCam) + metadane frustum
    • computeGroundFootprint(frustum, projection) — spróbkowany wielokąt (8 / 32 punktów na krawędź)
    • slantToGroundRadius(frustum, slantM) — √(slant² − h²) z kontrolą osiągalności
    • computeSegmentShadow / computePolygonShadow — rzutowanie cienia na grunt per segment / per wielokąt
    • subtractObstacleShadows(footprint, shadows) — różnica wielokątów Martíneza–Ruedy
    • computeFloorFootprint(frustum, z, projection) — wariant wielopiętrowy

    Stałe domyślne

    • defaultLensProjection: rektylinearna gdy HFOV < 170°, ekwidystansowa w przeciwnym razie
    • SAMPLES_PER_EDGE: 8 dla rektylinearnej, 32 dla projekcji fisheye
    • Odległość przycinania cienia: renderRange × 4 (pokrywa przycinanie dalekiej krawędzi przy dowolnej rozsądnej odległości przeszkody)
    • Klamp horyzontalny dalekiej krawędzi: promienie, których przecięcie z gruntem przekracza renderRange w odległości poziomej, są rzutowane z powrotem na renderRange wzdłuż ich kierunku poziomego (zapobiega artefaktom „błądzącej linii" przy horyzoncie na dalekim łuku wielokąta).

    Reprodukcja matematyki od zera: zbuduj CameraFrustum w udokumentowanej formie { x, y, h, panDeg, tiltDeg, hfovDeg, vfovDeg, renderRangeM, pixelsPerMeter }; spróbkuj narożniki płaszczyzny obrazu na sH, sV ∈ [−1, +1]z 8 próbkami na krawędź (32 dla fisheye); przetnij każdy promień z płaszczyzną z = 0; zastosuj różnicę polygon-clipping dla odejmowania cieni. Modulo efekty kolejności IEEE 754 w kroku boolowskim na wielokątach, wynik zgadza się z wielokątem renderowanym przez działający designer co do precyzji liczb zmiennoprzecinkowych (sub-milimetrowo dla wejść w skali rzeczywistej).

    Bibliografia

    • IEC 62676-4:2014 (z poprawkami) — Systemy dozoru wizyjnego do zastosowań w ochronie, część 4: wytyczne aplikacyjne (DORI, odległości na cel). Identyczny tekst opublikowany jako EN 62676-4 w wydaniu europejskim.
    • Hartley i Zisserman, Multiple View Geometry in Computer Vision, wyd. 2, Cambridge University Press, 2004 (modele projekcji kamery, geometria frustum).
    • Kannala i Brandt, „A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses", IEEE TPAMI, 2006 (porównanie projekcji rektylinearnej / ekwidystansowej / ekwisolidnej).
    • Martínez, Rueda i Feito, „A new algorithm for computing Boolean operations on polygons", Computers & Geosciences, 2009 — oryginalny algorytm Martíneza–Ruedy. Praca z 2013 „A simple algorithm for Boolean operations on polygons" (Advances in Engineering Software) to wariant zaimplementowany w bibliotece polygon-clipping używanej tutaj.