traffic-scene / webcam_stub.py
0xdivin3's picture
Upload 8 files
72534cf verified
Raw
History Blame Contribute Delete
2.07 kB
"""
webcam_stub.py
--------------
NOT wired into app.py — this is a reference/starting point in case the
supervisor later asks for live webcam detection.
Streamlit does not have a built-in "video loop" the way a desktop GUI does,
so live webcam detection needs either:
Option A (simplest, local machine only):
Use OpenCV directly to open the webcam (cv2.VideoCapture(0)) inside
a `while st.session_state.running:` loop, calling
st.image(...) repeatedly to refresh a placeholder. Works, but is a bit
choppy and only works when Streamlit runs on the SAME machine as the
webcam (fine for a local project demo / defense).
Option B (proper, works in a real browser/deployed app):
Use the `streamlit-webrtc` package, which streams frames from the
BROWSER's webcam to the Python backend over WebRTC. This is the
correct approach if the app will be accessed remotely (e.g. deployed
to Streamlit Cloud) rather than run locally during a defense.
pip install streamlit-webrtc
Below is a minimal Option A example, since most project defenses happen
on the student's own laptop.
"""
import cv2
import streamlit as st
from detector import TrafficDetector
def webcam_tab(detector: TrafficDetector):
st.header("Live Webcam Detection (experimental)")
st.caption("Runs locally using your machine's webcam. Click Stop to end the session.")
run = st.checkbox("Start Webcam")
frame_placeholder = st.empty()
if run:
cap = cv2.VideoCapture(0)
while run and cap.isOpened():
ok, frame = cap.read()
if not ok:
st.warning("Could not read from webcam.")
break
annotated, _counts = detector.detect_frame(frame)
annotated_rgb = cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB)
frame_placeholder.image(annotated_rgb, use_container_width=True)
# Re-check the checkbox each loop so "Stop" actually stops it.
run = st.session_state.get("Start Webcam", run)
cap.release()