RiverWatch

A camera that watches the low-water crossing for you

Over half of flood drownings happen when a vehicle is driven into flood water, and low-water crossings are where it happens. RiverWatch reads the water level from existing USGS river cameras with OpenCV 5, cross-checks it against official gages, and an Amazon Nova agent decides what to do next: look more often, flag a broken sensor, or ask a human to close the crossing. Everything runs on AWS (Lambda on Graviton, S3, CloudFront, Bedrock, SNS).

Live: Cowhouse Creek at W Range Rd, Fort Hood, TX

loading…
Latest camera frame annotated by OpenCV: blue is water measured as flowing, the yellow line is the measured waterline
Latest USGS camera frame, annotated by OpenCV 5 running in AWS Lambda. Blue: flowing water. Yellow: measured waterline.
…

Forecast, next 60 min
–
Agent watch level
–
Next check
–
Last cycle
–

Last 12 hours

Agent trace of the last cycle

    Replay: the 2 October 2026 flash flood

    real frames and gage data, agent re-run on a simulated clock

    The camera calibration used here was fitted without this day, so the flood is unseen. Every tool only sees data up to the simulated time. The duty operator is simulated and approves 10 minutes after each request.

    Camera frame at the selected time, annotated by OpenCV
    …

    Official gage
    –
    Camera (OpenCV 5)
    –
    Forecast, next 60 min
    –
    Next check chosen by agent
    –

      Evaluation

      camera stage vs. official USGS gage, 2026-09-09 to 2026-10-20
      Camera estimates against the official gage over the evaluation period
      Blocked cross-validation by day: each day is predicted with a calibration fitted on the other days only.

      Forecast: warning before the water arrives

      A small gradient-boosted model plus a physical rule on the upstream rise, trained on 9.5 years of both gages (46 closures since 2017) and evaluated leave-one-year-out. The gage alone warns 0 minutes ahead.

      2 October 2026: the upstream gage jumps at 10:00, the forecast warns, and the crossing closes at 10:30
      2 October 2026, local time: the upstream gage jumps, the early warning fires at 10:00, the crossing closes at 10:30.
      Warning lead time for each of the 46 closures
      Lead time per closure. In about half of the events rain falls on the crossing's own catchment and the upstream gage sees nothing: there the forecast cannot help and the camera's early detection matters.

      Where it fails

      How it works

      Architecture: USGS cameras and gages feed a Lambda on Graviton running OpenCV 5 and the agent loop, which calls Amazon Nova on Bedrock, stores state in S3, publishes through CloudFront and notifies the operator with SNS
      Agent workflow: OpenCV perception tools feed an Amazon Nova decision cycle with guardrails in code; actions are the watch level, sensor issue reports and requests to a human operator who approves public alerts
      1. Perceive (OpenCV 5). Quality gate (infrared night mode, blur, fog, contrast), ECC registration against the calibrated view using only static structures, flowing-water mask from local normalized cross-correlation between frames 15 minutes apart, waterline as the median top edge of the water body across the channel, monotone calibration to stage.
      2. Decide (Amazon Nova 2 Lite). The agent reads the camera, can look at the annotated frame itself, compares the official gage and the upstream gage, and chooses the next check interval.
      3. Act, with a human in the loop. Raising the public alert needs an operator. Guardrails in code: two independent confirmations to escalate, no lowering while a recent reading still implies a higher level.

      Data: USGS HIVIS cameras and NWIS gages (public domain). Thresholds: NWS "Turn Around, Don't Drown" guidance (6 inches of fast water can knock over an adult, 12 inches can carry away most cars, 2 feet can carry away SUVs and trucks).