CCTVPLANNER.IO / RESEARCH

    The geometry of CCTV camera coverage

    How a tilted, mounted camera images the ground — frustum geometry, lens projections, and the DORI distance standard, derived from first principles and illustrated with the same code that powers the live designer.

    1. From frustum to ground footprint

    A pinhole camera defines a view frustum: a four-sided pyramid extending from the camera's optical centre out to the boundaries of its image plane. Every pixel is one ray from the optical centre through the corresponding point on the image plane. To find what region of the ground a camera covers, we intersect each ray with the ground plane and keep the points that fall inside the camera's range.

    For a camera mounted at height h, tilted by an angle α below horizontal, with a vertical field of view vfov, the four corner rays of the frustum trace out the outer envelope of coverage on the ground. In typical mounting configurations (where α + vfov/2 < 90°), the shape is a truncated trapezoid with curved corners — not a triangle or a sector originating at the camera mount. As α + vfov/2 approaches 90° (very steep ceiling-mount dome cameras), the lower edge of the image starts hitting the ground at the base of the camera and the trapezoid degenerates toward a sector.

    h = 4 m · tilt = 30° · hfov = 106° · vfov = 70° · range = 25 mrange circle (25 m)

    Top-down ground footprint for a camera with h = 4 m, tilt = 30°, hfov = 106°. The lower edge of the image meets the ground a short distance in front of the camera; the lateral edges fan outward; the far edge is clamped at the camera's effective range.

    2. The lower-edge / upper-edge intersection

    The lower-edge ray (sV = −1 in image-plane coordinates) hits the ground at:

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

    The upper-edge ray (sV = +1) hits at:

    d_far = h / tan(α − vfov/2)            if α > vfov/2  (entirely below horizon)
            unbounded                       if α ≤ vfov/2  (upper edge above horizon
                                                            — clamped at renderRange)
    h = 4 mcamera (h = 4 m)blind 0 – 4.8 md_near = 4.8 mrenderRange = 10 mh = 4 m · tilt α = 15° · vfov = 50°

    Side view, h = 4 m, tilt = 15°, vfov = 50°. The two blue lines are the lower- and upper-edge rays of the frustum; the thick blue strip on the ground marks where the camera images the floor (from d_near to renderRange). The red wedge under the mast is the geometric region the lens cannot resolve.

    For the lateral edges (sH = ±1), the same construction applies in the horizontal plane: each lateral ray sweeps across the camera's HFOV at every height of the image plane. For rectilinear lenses (the dominant CCTV optic) these project to diverging straight lines on the ground, producing the trapezoid's slanted sides. For fisheye lenses the same mapping is curved and the footprint becomes a curved disk.

    3. The geometric blind spot

    For any camera mounted above the ground and tilted less than 90° − vfov/2, there is a region directly under the mount that no ray of the frustum can reach. The lower edge of the image points at α + vfov/2 below horizontal; everything closer than d_near is outside the camera's image entirely.

    With tilt and FOV held constant, the blind spot scales linearly with mounting height — the formula reduces to d_near = h × cot(α + vfov/2), where the cotangent term is fixed by the lens. A camera tilted 15° with a 50° vertical FOV has a blind spot of 4.8 m at 4 m mounting height and 23.8 m at 20 m — a 5× ratio matching the height ratio. The ratio of blind area to coverage area is the dominant constraint on high-mast camera placement.

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

    Same lens, same 15° tilt, just mounted higher (h = 20 m): the blind spot grows proportionally to height, independent of focal length or sensor size.

    4. DORI ranges (EN 62676-4)

    The DORI standard (Detect / Observe / Recognize / Identify) defines target pixel densities at specific ranges from the camera. Per EN 62676-4 those ranges are horizontal distances on the ground between the camera and the target — not slant distances along the optical axis. Major manufacturer datasheets (Axis, Hikvision, Dahua, Bosch) follow this convention.

    On a 2D map the four DORI tiers are simply concentric arcs at radii equal to their horizontal distances, clipped by the camera's footprint polygon. Wherever the footprint doesn't reach that radius, the corresponding part of the arc is hidden — for narrow-HFOV cameras the cone is too thin to contain the full circle so the lateral ends of each tier are clipped, and for short-range cameras the larger tiers fall outside the cone entirely.

    Identify → 8 mRecognize → 16 mObserve → 32 mDetect → 64 mh = 4 m · tilt = 20° · hfov = 90° · range = 70 mEach ring = ground arc at the tier's horizontal distance from the camera (EN 62676-4)

    DORI rings as on-ground arcs inside the camera's footprint. h = 4 m, tilt = 20°, hfov = 90°, range = 70 m. Tier values shown (8 / 16 / 32 / 64 m) are illustrative for a typical 1080p camera at ~90° HFOV; the actual horizontal distances depend on the sensor and focal length. EN 62676-4 specifies the pixel densities at each tier (Identify: 250 px/m, Recognize: 125 px/m, Observe: 62 px/m, Detect: 25 px/m), from which the per-camera horizontal ranges are derived.

    Slant-distance interpretation (when applicable). If a particular datasheet specifies the range as a slant distance from the lens — uncommon for general-purpose CCTV optics, occasionally seen for thermal or telephoto lens specs — the equivalent horizontal range on the ground is √(d_slant² − h²). A 6 m mounted camera with an 8 m slant Identify range covers a 5.3 m horizontal radius (√(64 − 36)). The geometry module exposes both forms; the page diagram uses the standard horizontal interpretation.

    5. Lens projection types

    Different lens designs map the angle from the optical axis to the image-plane radius differently. The three projections used in CCTV are:

    Projectionr(θ)Typical range
    Rectilinearf · tan θHFOV ≲ 120° (most fixed and varifocal CCTV lenses)
    Equidistantf · θHFOV ≳ 140° (panoramic / fisheye)
    Equisolid2 f · sin(θ/2)Fisheye lenses preserving solid angle

    θ = angle from the optical axis (radians); f = focal length. r(θ) is the radial distance on the image plane from the principal point.

    For rectilinear lenses, the off-axis lateral factor tan(θ) exceeds 1 once θ passes 45° from the optical axis (i.e. when HFOV exceeds 90°), and grows without bound as θ approaches 90° (HFOV approaching 180°). In real-world optics, corner stretching becomes severe well before the math diverges — most lens designers transition to quasi-fisheye glass around 120–140° HFOV, with full fisheye lenses used above ~170°.

    CCTVplanner.io currently selects the rectilinear projection up to 170° HFOV, beyond which corner stretching grows large enough that we switch to equidistant for numerical stability. Cameras between ~140° and 170° HFOV are therefore modelled with rectilinear math even if their physical lens is closer to fisheye — we accept this in exchange for simpler corner geometry. The equisolid projection is supported in the geometry layer (for manufacturer data that specifies it explicitly), though there is no user-facing toggle for it yet.

    Datasheet caveat: HFOV vs DFOV

    Many manufacturers — particularly the major Asian brands (Dahua, Hikvision, Uniview, Tiandy) — quote a single field-of-view number on the spec sheet that's actually the diagonal field of view (DFOV), not the horizontal. Plugging a DFOV value into a tool that expects HFOV produces a footprint that's 10–15 % too wide, with the error concentrated at the lateral edges where pixel density matters most.

    For a sensor with horizontal-to-vertical aspect ratio a (e.g. 16:9 → a = 16/9), the conversion is:

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

    The mapping is non-linear in the angle: tempting linear shortcuts of the form HFOV ≈ k × DFOV work for narrow lenses but fail badly once the field of view widens. For a 16:9 sensor the exact conversions are:

    DFOV (16:9)Exact HFOVExact VFOVLinear-shortcut error
    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°

    "Linear-shortcut error" = HFOV from the naive formula HFOV = (a / √(a²+1)) × DFOV minus the exact value. The shortcut understates HFOV by 5–13° in the wide-angle range that dominates modern CCTV optics — far more than the ±1° datasheet tolerance assumed in §9. Always use the tan-based formula or the exact values above.

    CCTVplanner.io's camera database stores HFOV (the canonical CCTV measurement) and converts on import for cameras whose datasheets only specify DFOV. When entering a custom camera by hand, check the units before plugging the number into the HFOV field — getting this wrong is one of the two most common reasons site-survey footprints don't match installed reality (the other being sensor aspect ratio).

    6. Obstacles, shadows, and the visible footprint

    Walls, fences and tall structures block rays from the camera. To compute the visible footprint we model each opaque obstacle as a polygon (closed perimeter) or polyline (open fence) and project a per-segment shadow quad: each segment is extended away from the camera to several times the render range. The union of these per-segment shadows is the silhouette of the obstacle plus everything behind it as seen from the camera.

    The visible footprint is then footprint − ⋃ shadows, computed via the Martinez–Rueda polygon-difference algorithm. The result is a polygon (or a list of disjoint polygons, when an obstacle splits the cone) whose edges align cleanly with both the frustum's far arc and every blocking wall.

    For 3D-aware analysis, an obstacle that is shorter than the camera's mounting height does not block the ray entirely — it casts a finite ground shadow extending behind the obstacle. For a wall at horizontal distance d from the camera, with mounting height h_cam and obstacle top height h_obs, the shadow extends from the wall to a horizontal distance:

    d_shadow_end = d × h_cam / (h_cam − h_obs)            for h_cam > h_obs
    
    For h_obs ≥ h_cam the obstacle blocks the line of sight
    entirely — equivalent to an infinite shadow. The designer
    treats this case as a fully opaque blocker (no see-over)
    and applies the same per-segment shadow projection used in
    the 2D obstacle-clipping path.

    Toggling "Use vertical height (3D)" on a building or fence in the designer switches it to this shadow-projecting model. When the camera is shorter than the obstacle (or equal in height), the toggle has no effect.

    7. Multi-floor projection

    The frustum-to-ground intersection generalises trivially to any horizontal plane. Replace the floor equation z = 0 with z = z_target, solve the same ray-plane equation for every corner ray, and the result is the camera's footprint on that target floor. A camera mounted on the second storey of an atrium covers the ground floor by the same construction as a ground-mounted camera covers its own floor, just with a different value of z_target and a modified vertical offset between the camera and the target plane.

    The math layer for multi-floor projection ships in the geometry module today; the floor-selector UI and Three.js scene preview are queued for a future release.

    8. Assumptions and limitations

    Every formula above rests on a set of simplifying assumptions. They hold for the bulk of fixed-mount CCTV scenarios but break down in specific conditions; document them so practitioners can decide when to trust the model.

    Model assumptions

    • Flat ground (the floor is the plane z = 0) — no terrain slope, no Earth curvature.
    • Static camera at the moment of capture — no PTZ motion during the frame, no vibration.
    • Pinhole camera model — no lens distortion. Real lenses introduce Brown–Conrady radial and tangential distortion (coefficients k₁, k₂, p₁, p₂) which we do not model.
    • Ideal calibration — sensor pixel pitch, focal length, and optical centre exactly match manufacturer specifications.
    • No rolling-shutter artefacts; the entire image is captured at one instant.
    • No camera roll — the optical axis is rotated only by pan and tilt; the sensor remains horizontal.
    • Single optical path — no glass dome refraction, no reflective surfaces in the scene.
    • Atmospheric refraction is negligible at typical CCTV ranges (sub-1 cm error at 50 m).

    When the model breaks down

    • Sloped terrain. The ground footprint shifts asymmetrically: the down-slope side extends further than the model predicts, the up-slope side compresses. The error is roughly ±h · tan(slope) per metre of horizontal distance.
    • Wide-angle lens distortion. Beyond ~110° HFOV the rectilinear projection diverges from the lens's actual mapping by 1–5 % at the corners. Equidistant / equisolid projections are available in the geometry layer for these cases (see §5).
    • Glass dome cameras. The dome introduces a small refractive shift at the lens entrance (mm at typical mounting heights). For high-precision DORI work on mirrored-glass installations this becomes non-trivial; for general planning it is below other error sources.
    • Multi-bounce optics. Reflections from glass walls, mirrored ceilings, or polished floors are not traced. The model returns the line-of-sight footprint only.
    • PTZ in motion. The model gives the instantaneous footprint at one pan/tilt setting. Coverage of a moving PTZ over time is the swept footprint, not the instantaneous one.
    • Installation tolerance. Real install angles deviate from design by 1–3° (technician error). The next section quantifies how this propagates to ground error.

    9. Error sensitivity

    Errors in the input parameters (mounting height, tilt angle, FOV) propagate to ground-position errors in the footprint. For the lower-edge ground intersection d_near = h / tan(α + vfov/2), the partial derivatives give:

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

    The angular partials are in radians; multiply by π/180 (≈ 0.01745) to convert to per-degree. The table below applies the conversion.

    For a typical configuration (h = 10 m, tilt = 15°, vfov = 50° → d_near ≈ 11.9 m), small errors in each parameter produce the following deviations in d_near:

    ParameterInput errorΔ d_nearNote
    tilt α±1°±0.42 mtypical inclinometer resolution
    tilt α±3°±1.27 meyeball install on bracket
    height h±0.5 m±0.59 mtape measurement, inaccessible mast
    vfov±1°±0.21 mdatasheet rounding
    all combinedRMS~1.4 mat 3° tilt + 0.5 m height + 1° fov

    The dominant term is install-angle uncertainty: in the configuration above, every degree of tilt error costs ~42 cm in ground-position accuracy at d_near. A laser inclinometer reading to 0.1° resolution keeps tilt-driven d_near error below 5 cm; an eyeballed bracket install is good to roughly ±1 m. For DORI tier verification (where the difference between Recognize and Identify ground rings can be 2–3 m), tilt should be measured, not estimated.

    The same partial-derivative analysis applies to lateral footprint width through HFOV — a 1° HFOV error produces approximately 2 · d · tan(½°) ≈ 1.7 % lateral spread error at distance d. At 30 m range that's ~52 cm of lateral uncertainty, which is why we treat manufacturer HFOV figures as ±1° rather than exact.

    10. Reproducibility

    All formulas in this article are implemented verbatim in the geometry module that ships with CCTVplanner.io's designer. The module is covered by a comprehensive unit-test suite spanning rectilinear / equidistant / equisolid projections, blind-spot edge cases, DORI ground projection, polygon Boolean obstacle clipping, and the multi-floor extension. Every diagram on this page is rendered by calling the same functions the live designer uses.

    Key entry points

    • buildFrustum(args) — camera basis (forward / right / upCam) + frustum metadata
    • computeGroundFootprint(frustum, projection) — sampled polygon (8 / 32 points per edge)
    • slantToGroundRadius(frustum, slantM) — √(slant² − h²) with reachability check
    • computeSegmentShadow / computePolygonShadow — per-segment / per-polygon ground shadow projection
    • subtractObstacleShadows(footprint, shadows) — Martínez–Rueda polygon difference
    • computeFloorFootprint(frustum, z, projection) — multi-floor variant

    Default constants

    • defaultLensProjection: rectilinear when HFOV < 170°, equidistant otherwise
    • SAMPLES_PER_EDGE: 8 for rectilinear, 32 for fisheye projections
    • Shadow clip distance: renderRange × 4 (covers far-edge clipping at any reasonable obstacle distance)
    • Far-edge horizontal clamp: rays whose ground intersection exceeds renderRange in horizontal distance are projected back to renderRange along their horizontal direction (prevents near-horizon stray-line artefacts at the polygon's far arc).

    Reproducing the math from scratch: build a CameraFrustumwith the published { x, y, h, panDeg, tiltDeg, hfovDeg, vfovDeg, renderRangeM, pixelsPerMeter }shape; sample image-plane corners at sH, sV ∈ [−1, +1] with 8 samples per edge (32 for fisheye); intersect each ray with the z = 0 plane; apply polygon-clipping difference for shadow subtraction. Modulo IEEE 754 ordering effects in the polygon Boolean step, the result matches the live designer's rendered polygon to floating-point precision (sub-millimetre on real-scale inputs).

    References

    • IEC 62676-4:2014 (with amendments) — Video surveillance systems for use in security applications, part 4: application guidelines (DORI, target distances). Identical text published as EN 62676-4 in the European edition.
    • Hartley & Zisserman, Multiple View Geometry in Computer Vision, 2nd ed., Cambridge University Press, 2004 (camera projection models, frustum geometry).
    • Kannala & Brandt, "A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses," IEEE TPAMI, 2006 (rectilinear / equidistant / equisolid projection comparison).
    • Martínez, Rueda & Feito, "A new algorithm for computing Boolean operations on polygons," Computers & Geosciences, 2009 — original Martínez–Rueda algorithm. The 2013 follow-up "A simple algorithm for Boolean operations on polygons" (Advances in Engineering Software) is the variant implemented in the polygon-clipping library used here.