CCTVPLANNER.IO / INVESTIGAÇÃO

    A geometria da cobertura de câmaras CCTV

    Como uma câmara montada e inclinada captura o solo — geometria do frustum, projeções de lentes e a norma de distância DORI, derivadas a partir de princípios fundamentais e ilustradas com o mesmo código que alimenta o designer em tempo real.

    1. Do frustum à projeção no solo

    Uma câmara estenopeica (pinhole) define um frustum visual: uma pirâmide de quatro lados que se estende desde o centro ótico da câmara até às fronteiras do seu plano de imagem. Cada píxel é um raio do centro ótico através do ponto correspondente no plano de imagem. Para descobrir que região do solo uma câmara cobre, intersetamos cada raio com o plano do solo e mantemos os pontos que caem dentro do alcance da câmara.

    Para uma câmara montada à altura h, inclinada por um ângulo α abaixo da horizontal, com um campo de visão vertical vfov, os quatro raios de canto do frustum traçam o envelope externo da cobertura no solo. Em configurações de montagem típicas (onde α + vfov/2 < 90°), a forma é um trapézio truncado com cantos curvos — não um triângulo nem um setor com origem no ponto de montagem. Quando α + vfov/2 se aproxima dos 90° (câmaras dome muito inclinadas montadas no teto), o bordo inferior da imagem começa a atingir o solo na base da câmara e o trapézio degenera para um setor.

    h = 4 m · tilt = 30° · hfov = 106° · vfov = 70° · range = 25 mcírculo de alcance (25 m)

    Projeção no solo em vista superior para uma câmara com h = 4 m, inclinação = 30°, hfov = 106°. O bordo inferior da imagem encontra o solo a uma curta distância à frente da câmara; os bordos laterais abrem-se em leque; o bordo distante é limitado pelo alcance efetivo da câmara.

    2. A interseção do bordo inferior / superior

    O raio do bordo inferior (sV = −1 em coordenadas do plano de imagem) atinge o solo em:

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

    O raio do bordo superior (sV = +1) atinge em:

    d_far = h / tan(α − vfov/2)            se α > vfov/2  (inteiramente abaixo do horizonte)
            ilimitado                       se α ≤ vfov/2  (bordo superior acima do horizonte
                                                            — limitado a renderRange)
    h = 4 mcâmara (h = 4 m)cega 0 – 4.8 md_near = 4.8 mrenderRange = 10 mh = 4 m · tilt α = 15° · vfov = 50°

    Vista lateral, h = 4 m, inclinação = 15°, vfov = 50°. As duas linhas azuis são os raios de bordo inferior e superior do frustum; a faixa azul espessa no solo marca onde a câmara capta o pavimento (de d_near até renderRange). A cunha vermelha sob o mastro é a região geométrica que a lente não consegue resolver.

    Para os bordos laterais (sH = ±1), a mesma construção aplica-se no plano horizontal: cada raio lateral varre através do HFOV da câmara em cada altura do plano de imagem. Para lentes retilíneas (a ótica CCTV dominante), estes projetam linhas retas divergentes no solo, produzindo os lados inclinados do trapézio. Para lentes fisheye o mesmo mapeamento é curvo e a projeção torna-se um disco curvo.

    3. A zona cega geométrica

    Para qualquer câmara montada acima do solo e inclinada menos do que 90° − vfov/2, existe uma região diretamente debaixo do ponto de montagem que nenhum raio do frustum consegue alcançar. O bordo inferior da imagem aponta a α + vfov/2 abaixo da horizontal; tudo o que está mais próximo do que d_near está totalmente fora da imagem da câmara.

    Mantendo a inclinação e o FOV constantes, a zona cega cresce linearmente com a altura de montagem — a fórmula reduz-se a d_near = h × cot(α + vfov/2), onde o termo cotangente é fixado pela lente. Uma câmara inclinada 15° com FOV vertical de 50° tem uma zona cega de 4,8 m a 4 m de altura de montagem e 23,8 m a 20 m — uma proporção de 5× correspondente à proporção de altura. A relação entre área cega e área de cobertura é a restrição dominante no posicionamento de câmaras em mastros altos.

    h = 20 mcâmara (h = 20 m)cega 0 – 23.8 md_near = 23.8 mrenderRange = 50 mh = 20 m · tilt α = 15° · vfov = 50°

    Mesma lente, mesma inclinação de 15°, apenas montada mais alto (h = 20 m): a zona cega cresce proporcionalmente à altura, independentemente da distância focal ou do tamanho do sensor.

    4. Distâncias DORI (EN 62676-4)

    A norma DORI (Detect / Observe / Recognize / Identify — Detetar / Observar / Reconhecer / Identificar) define densidades de píxeis no alvo a distâncias específicas da câmara. De acordo com a EN 62676-4, essas distâncias são distâncias horizontais no solo entre a câmara e o alvo — não distâncias inclinadas ao longo do eixo ótico. As fichas técnicas dos principais fabricantes (Axis, Hikvision, Dahua, Bosch) seguem esta convenção.

    Num mapa 2D, os quatro níveis DORI são simplesmente arcos concêntricos em raios iguais às suas distâncias horizontais, recortados pelo polígono da projeção da câmara. Onde a projeção não alcança esse raio, a parte correspondente do arco fica oculta — para câmaras com HFOV estreito o cone é demasiado fino para conter o círculo completo, pelo que as extremidades laterais de cada nível são recortadas, e para câmaras de curto alcance os níveis maiores caem inteiramente fora do cone.

    Identificar → 8 mReconhecer → 16 mObservar → 32 mDetetar → 64 mh = 4 m · tilt = 20° · hfov = 90° · range = 70 mCada arco = distância horizontal da câmara para o nível correspondente (EN 62676-4)

    Anéis DORI como arcos no solo dentro da projeção da câmara. h = 4 m, inclinação = 20°, hfov = 90°, alcance = 70 m. Os valores de nível mostrados (8 / 16 / 32 / 64 m) são ilustrativos para uma câmara 1080p típica a ~90° HFOV; as distâncias horizontais reais dependem do sensor e da distância focal. A EN 62676-4 especifica as densidades de píxeis em cada nível (Identificar: 250 px/m, Reconhecer: 125 px/m, Observar: 62 px/m, Detetar: 25 px/m), a partir das quais se derivam os alcances horizontais por câmara.

    Interpretação por distância inclinada (quando aplicável). Se uma ficha técnica específica indicar o alcance como uma distância inclinada a partir da lente — invulgar para ótica CCTV de uso geral, ocasionalmente visto em especificações de lentes térmicas ou teleobjetivas — o alcance horizontal equivalente no solo é √(d_slant² − h²). Uma câmara montada a 6 m com alcance inclinado de Identificação de 8 m cobre um raio horizontal de 5,3 m (√(64 − 36)). O módulo de geometria expõe ambas as formas; o diagrama da página utiliza a interpretação horizontal padrão.

    5. Tipos de projeção de lente

    Diferentes desenhos de lentes mapeiam o ângulo a partir do eixo ótico para o raio do plano de imagem de forma diferente. As três projeções utilizadas em CCTV são:

    Projeçãor(θ)Intervalo típico
    Retilíneaf · tan θHFOV ≲ 120° (maioria das lentes CCTV fixas e varifocais)
    Equidistantef · θHFOV ≳ 140° (panorâmica / fisheye)
    Equissólida2 f · sin(θ/2)Lentes fisheye que preservam o ângulo sólido

    θ = ângulo a partir do eixo ótico (radianos); f = distância focal. r(θ) é a distância radial no plano de imagem a partir do ponto principal.

    Para lentes retilíneas, o fator lateral fora do eixo tan(θ) ultrapassa 1 quando θ excede 45° do eixo ótico (ou seja, quando o HFOV excede 90°), e cresce sem limite à medida que θ se aproxima dos 90° (HFOV a aproximar-se de 180°). Em óticas reais, o estiramento dos cantos torna-se severo bem antes de a matemática divergir — a maioria dos projetistas de lentes faz a transição para vidro quase-fisheye em torno dos 120–140° HFOV, com lentes fisheye completas utilizadas acima dos ~170°.

    O CCTVplanner.io seleciona atualmente a projeção retilínea até 170° HFOV, acima dos quais o estiramento dos cantos cresce o suficiente para mudarmos para a equidistante por estabilidade numérica. As câmaras entre ~140° e 170° HFOV são portanto modeladas com matemática retilínea mesmo que a sua lente física esteja mais próxima do fisheye — aceitamos isto em troca de uma geometria de canto mais simples. A projeção equissólida é suportada na camada de geometria (para dados de fabricantes que a especificam explicitamente), embora ainda não exista um interruptor visível ao utilizador para a mesma.

    Ressalva da ficha técnica: HFOV vs DFOV

    Muitos fabricantes — particularmente as grandes marcas asiáticas (Dahua, Hikvision, Uniview, Tiandy) — indicam um único número de campo de visão na ficha técnica que é, na verdade, o campo de visão diagonal (DFOV), e não o horizontal. Inserir um valor DFOV numa ferramenta que espera HFOV produz uma projeção 10–15 % demasiado larga, com o erro concentrado nos bordos laterais — onde a densidade de píxeis mais importa.

    Para um sensor com proporção horizontal-vertical a (p. ex. 16:9 → a = 16/9), a conversão é:

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

    O mapeamento é não linear no ângulo: atalhos lineares apelativos da forma HFOV ≈ k × DFOV funcionam para lentes estreitas mas falham gravemente quando o campo de visão se amplia. Para um sensor 16:9 as conversões exatas são:

    DFOV (16:9)HFOV exatoVFOV exatoErro do atalho linear
    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°

    "Erro do atalho linear" = HFOV pela fórmula ingénua HFOV = (a / √(a²+1)) × DFOV menos o valor exato. O atalho subestima o HFOV em 5–13° na gama grande-angular que domina a ótica CCTV moderna — muito mais do que a tolerância de ±1° das fichas técnicas assumida no §9. Utilize sempre a fórmula baseada em tan ou os valores exatos acima.

    A base de dados de câmaras do CCTVplanner.io guarda o HFOV (a medição canónica de CCTV) e converte na importação para câmaras cujas fichas técnicas especificam apenas o DFOV. Ao introduzir uma câmara personalizada manualmente, verifique as unidades antes de inserir o número no campo HFOV — errar nisto é uma das duas razões mais comuns para projeções de levantamento não corresponderem à realidade instalada (a outra é a proporção do sensor).

    6. Obstáculos, sombras e a projeção visível

    Paredes, vedações e estruturas altas bloqueiam raios da câmara. Para calcular a projeção visível, modelamos cada obstáculo opaco como um polígono (perímetro fechado) ou polilinha (vedação aberta) e projetamos um quadrilátero de sombra por segmento: cada segmento é estendido para longe da câmara em várias vezes o alcance de renderização. A união destas sombras por segmento é a silhueta do obstáculo, mais tudo o que está atrás dele, conforme visto pela câmara.

    A projeção visível é então projeção − ⋃ sombras, calculada através do algoritmo de diferença de polígonos de Martínez–Rueda. O resultado é um polígono (ou uma lista de polígonos disjuntos, quando um obstáculo divide o cone) cujos bordos se alinham de forma limpa tanto com o arco distante do frustum como com cada parede bloqueadora.

    Para análise consciente da 3D, um obstáculo mais baixo do que a altura de montagem da câmara não bloqueia totalmente o raio — projeta uma sombra finita no solo, estendendo-se atrás do obstáculo. Para uma parede a uma distância horizontal d da câmara, com altura de montagem h_cam e altura do topo do obstáculo h_obs, a sombra estende-se da parede até uma distância horizontal de:

    d_shadow_end = d × h_cam / (h_cam − h_obs)            para h_cam > h_obs
    
    Para h_obs ≥ h_cam o obstáculo bloqueia totalmente a linha de
    visão — equivalente a uma sombra infinita. O designer trata
    este caso como um bloqueador totalmente opaco (sem visão por
    cima) e aplica a mesma projeção de sombra por segmento usada
    no caminho de recorte de obstáculos 2D.

    Ativar "Usar altura vertical (3D)" num edifício ou vedação no designer alterna para este modelo com projeção de sombra. Quando a câmara é mais baixa do que o obstáculo (ou de altura igual), o interruptor não tem efeito.

    7. Projeção em múltiplos pisos

    A interseção frustum-solo generaliza-se trivialmente para qualquer plano horizontal. Substitua a equação do pavimento z = 0 por z = z_target, resolva a mesma equação raio-plano para cada raio de canto, e o resultado é a projeção da câmara nesse piso de destino. Uma câmara montada no segundo piso de um átrio cobre o rés-do-chão pela mesma construção pela qual uma câmara montada no chão cobre o seu próprio piso, apenas com um valor diferente de z_target e um deslocamento vertical modificado entre a câmara e o plano de destino.

    A camada matemática para projeção em múltiplos pisos já está disponível no módulo de geometria atualmente; a interface de seleção de piso e a pré-visualização de cena Three.js estão em fila para uma versão futura.

    8. Pressupostos e limitações

    Cada fórmula acima assenta num conjunto de pressupostos simplificadores. Aplicam-se à maioria dos cenários CCTV de montagem fixa, mas falham em condições específicas; documentamo-los para que os profissionais possam decidir quando confiar no modelo.

    Pressupostos do modelo

    • Solo plano (o pavimento é o plano z = 0) — sem inclinação de terreno, sem curvatura terrestre.
    • Câmara estática no momento da captura — sem movimento PTZ durante o quadro, sem vibração.
    • Modelo de câmara estenopeica — sem distorção de lente. As lentes reais introduzem distorção radial e tangencial de Brown–Conrady (coeficientes k₁, k₂, p₁, p₂) que não modelamos.
    • Calibração ideal — passo de píxel do sensor, distância focal e centro ótico correspondem exatamente às especificações do fabricante.
    • Sem artefactos de obturador rolante; toda a imagem é capturada num instante.
    • Sem rotação da câmara em torno do eixo ótico (roll) — o eixo ótico é rodado apenas por pan e inclinação; o sensor permanece horizontal.
    • Caminho ótico único — sem refração de cúpula de vidro, sem superfícies refletoras na cena.
    • A refração atmosférica é desprezável em alcances CCTV típicos (erro inferior a 1 cm a 50 m).

    Quando o modelo falha

    • Terreno inclinado. A projeção no solo desloca-se assimetricamente: o lado a jusante estende-se mais do que o modelo prevê, o lado a montante comprime-se. O erro é aproximadamente ±h · tan(inclinação) por metro de distância horizontal.
    • Distorção de lente grande-angular. Acima dos ~110° HFOV a projeção retilínea diverge do mapeamento real da lente em 1–5 % nos cantos. As projeções equidistante / equissólida estão disponíveis na camada de geometria para estes casos (ver §5).
    • Câmaras com cúpula de vidro. A cúpula introduz um pequeno deslocamento por refração à entrada da lente (milímetros em alturas de montagem típicas). Para trabalho DORI de alta precisão em instalações com vidro espelhado isto torna-se não trivial; para planeamento geral está abaixo de outras fontes de erro.
    • Ótica de múltiplas reflexões. As reflexões em paredes de vidro, tetos espelhados ou pavimentos polidos não são traçadas. O modelo devolve apenas a projeção em linha de vista.
    • PTZ em movimento. O modelo dá a projeção instantânea numa única configuração de pan/inclinação. A cobertura de uma PTZ em movimento ao longo do tempo é a projeção varrida, não a instantânea.
    • Tolerância de instalação. Os ângulos reais de instalação desviam-se do projeto em 1–3° (erro do técnico). A próxima secção quantifica como isto se propaga ao erro no solo.

    9. Sensibilidade ao erro

    Erros nos parâmetros de entrada (altura de montagem, ângulo de inclinação, FOV) propagam-se para erros de posição no solo na projeção. Para a interseção do bordo inferior com o solo d_near = h / tan(α + vfov/2), as derivadas parciais dão:

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

    As derivadas parciais angulares estão em radianos; multiplique por π/180 (≈ 0,01745) para converter para por grau. A tabela abaixo aplica a conversão.

    Para uma configuração típica (h = 10 m, inclinação = 15°, vfov = 50° → d_near ≈ 11,9 m), pequenos erros em cada parâmetro produzem os seguintes desvios em d_near:

    ParâmetroErro de entradaΔ d_nearNota
    inclinação α±1°±0,42 mresolução típica de inclinómetro
    inclinação α±3°±1,27 minstalação a olho em suporte
    altura h±0,5 m±0,59 mmedição com fita métrica, mastro inacessível
    vfov±1°±0,21 marredondamento de ficha técnica
    tudo combinadoRMS~1,4 ma 3° inclinação + 0,5 m altura + 1° fov

    O termo dominante é a incerteza do ângulo de instalação: na configuração acima, cada grau de erro de inclinação custa ~42 cm em precisão de posição no solo em d_near. Um inclinómetro a laser com resolução de 0,1° mantém o erro de d_near impulsionado pela inclinação abaixo de 5 cm; uma instalação em suporte feita a olho é boa até cerca de ±1 m. Para a verificação de níveis DORI (onde a diferença entre os anéis no solo de Reconhecimento e Identificação pode ser de 2–3 m), a inclinação deve ser medida, não estimada.

    A mesma análise de derivada parcial aplica-se à largura lateral da projeção através do HFOV — um erro de 1° no HFOV produz aproximadamente 2 · d · tan(½°) ≈ 1,7 % de erro de espalhamento lateral à distância d. A 30 m de alcance, são ~52 cm de incerteza lateral, razão pela qual tratamos os números HFOV dos fabricantes como ±1° em vez de exatos.

    10. Reprodutibilidade

    Todas as fórmulas neste artigo são implementadas literalmente no módulo de geometria que acompanha o designer do CCTVplanner.io. O módulo está coberto por uma suíte abrangente de testes unitários que abrange as projeções retilínea / equidistante / equissólida, casos limite da zona cega, projeção no solo DORI, recorte booleano de obstáculos por polígonos e a extensão para múltiplos pisos. Cada diagrama desta página é renderizado chamando as mesmas funções que o designer em tempo real utiliza.

    Pontos de entrada principais

    • buildFrustum(args) — base da câmara (forward / right / upCam) + metadados do frustum
    • computeGroundFootprint(frustum, projection) — polígono amostrado (8 / 32 pontos por bordo)
    • slantToGroundRadius(frustum, slantM) — √(slant² − h²) com verificação de alcançabilidade
    • computeSegmentShadow / computePolygonShadow — projeção de sombra no solo por segmento / por polígono
    • subtractObstacleShadows(footprint, shadows) — diferença de polígonos de Martínez–Rueda
    • computeFloorFootprint(frustum, z, projection) — variante para múltiplos pisos

    Constantes predefinidas

    • defaultLensProjection: retilínea quando HFOV < 170°, equidistante caso contrário
    • SAMPLES_PER_EDGE: 8 para retilínea, 32 para projeções fisheye
    • Distância de recorte de sombra: renderRange × 4 (cobre o recorte do bordo distante a qualquer distância razoável de obstáculo)
    • Limitação horizontal do bordo distante: os raios cuja interseção com o solo exceda renderRange em distância horizontal são projetados de volta para renderRange ao longo da sua direção horizontal (impede artefactos de linhas extraviadas próximas do horizonte no arco distante do polígono).

    Reproduzir a matemática a partir do zero: construir um CameraFrustum com a estrutura publicada { x, y, h, panDeg, tiltDeg, hfovDeg, vfovDeg, renderRangeM, pixelsPerMeter }; amostrar os cantos do plano de imagem em sH, sV ∈ [−1, +1] com 8 amostras por bordo (32 para fisheye); intersetar cada raio com o plano z = 0; aplicar a diferença de polígonos para subtração de sombras. Salvo efeitos de ordenação IEEE 754 no passo booleano de polígonos, o resultado coincide com o polígono renderizado pelo designer em tempo real até à precisão de vírgula flutuante (sub-milimétrica em entradas em escala real).

    Referências

    • IEC 62676-4:2014 (com emendas) — Sistemas de videovigilância para utilização em aplicações de segurança, parte 4: orientações de aplicação (DORI, distâncias do alvo). Texto idêntico publicado como EN 62676-4 na edição europeia.
    • Hartley & Zisserman, Multiple View Geometry in Computer Vision, 2.ª ed., Cambridge University Press, 2004 (modelos de projeção de câmara, geometria do frustum).
    • Kannala & Brandt, "A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses," IEEE TPAMI, 2006 (comparação de projeções retilínea / equidistante / equissólida).
    • Martínez, Rueda & Feito, "A new algorithm for computing Boolean operations on polygons," Computers & Geosciences, 2009 — algoritmo original de Martínez–Rueda. O seguimento de 2013 "A simple algorithm for Boolean operations on polygons" (Advances in Engineering Software) é a variante implementada na biblioteca polygon-clipping aqui utilizada.