utility

Passage Counter

Count A→B and B→A line-crossing events in a fixed camera view or local video.

Local processing
About your filesFiles and content selected in this tool are processed in your browser and are not uploaded to a Browser Kitty backend.
Operation demo See the basic workflow in a short video.

About this tool

Passage Counter counts people crossing a line in a fixed camera view or a video on your device, separating A→B and B→A events. A person who goes out and returns creates two events; it does not identify unique visitors.

Position the counting line, verify the camera setup for 30 seconds, and correct errors per direction. Export event history, session summary and 5/15/60-minute counts as CSV.

The bundled AI model processes footage locally without uploading it. Occlusion, backlighting and camera movement can cause errors. Physical 30-minute endurance and accuracy evaluation on 100+ real crossings remain unverified.

Good for

  • Count directional crossings at a corridor or event entrance
  • Count person crossings in an already recorded local video
  • Correct missed or extra automatic events and keep an adjustment history
  • Compare crossing counts by time bucket using CSV

What it can do

Key capabilities available in this tool.

How to use

  1. Mount the camera steadily and choose Start camera, or use Local video to import a recording. Grant camera access when requested.
  2. Move the line by dragging, adjust its endpoints, and reverse A/B if needed.
  3. In camera mode, run the 30-second check and redo it if the line moves. This step is not needed for video.
  4. Start counting to collect directional events. Video analysis begins at the start and ends with the clip.
  5. Correct missed or extra counts with +1/−1, and undo the last manual adjustment.
  6. Pause, resume or finish, then export events, summary and time-bucket CSV files.

Supported

  • Input: camera feed or local video that the browser can decode; format support varies.
  • Measurement: A→B/B→A crossing events, without unique-person identification.
  • Camera mode: 30-second check, start, pause and finish. Trial events do not affect totals.
  • Corrections: per-direction +1/−1, latest-adjustment Undo and audit history.
  • Exports: Events, Summary and 5/15/60-minute Time buckets CSV in UTF-8 with BOM.
  • Local records: sessions in IndexedDB; line and display settings in localStorage; no source video persistence.
  • Requirements: WebAssembly SIMD and decompression support; device and camera permissions vary.

Limitations and notes

  • Counts are crossing events, not unique people; a round trip counts twice.
  • Occlusion, poor light, fast motion, camera movement and slow devices can cause counting errors.
  • Background tabs, camera interruption and device rotation can cause missing coverage, not zero events.
  • Saved records do not restart the camera or video automatically and do not sync across browser origins.
  • Physical 30-minute endurance, Android/iPhone tests and direction-wise field accuracy on 100+ events are not yet verified.
  • Do not rely on counts alone for safety-critical, billing or legal reporting.
  • CSV excludes original media, and the app does not record or export source video.

Frequently asked questions

Does a round trip count twice?

Yes. Crossing A→B and returning B→A creates two events. It does not deduplicate people.

Can I correct automatic counts?

Yes. Use +1/−1 for either direction and Undo for the last manual adjustment. Changes are logged.

Are videos or camera frames uploaded?

No. Counting runs locally. The hosted page needs an initial HTML download.

Are the counts guaranteed accurate?

No. Lighting, overlap and camera positioning affect counts. Field accuracy testing on 100+ real events is still pending.

Offline version and source code

Person detection, crossings and CSV creation run locally. The standalone HTML bundles MediaPipe, EfficientDet-Lite0 and WASM with no runtime CDN or remote AI API. The hosted page needs an initial download. Use HTTPS if local file:// camera permissions are restricted.

View source on GitHub