import cv2 import streamlit as st from streamlit_webrtc import webrtc_streamer, WebRtcMode, VideoHTMLAttributes import numpy as np import av st.title("OpenCV Filters on Video Stream") # Define the filter state variable filter = "none" def transform(frame: av.VideoFrame): img = frame.to_ndarray(format="bgr24") # Apply the selected filter if filter == "blur": img = cv2.GaussianBlur(img, (21, 21), 0) elif filter == "canny": img = cv2.cvtColor(cv2.Canny(img, 100, 200), cv2.COLOR_GRAY2BGR) elif filter == "grayscale": img = cv2.cvtColor(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), cv2.COLOR_GRAY2BGR) elif filter == "sepia": kernel = np.array([[0.272, 0.534, 0.131], [0.349, 0.686, 0.168], [0.393, 0.769, 0.189]]) img = cv2.transform(img, kernel) elif filter == "invert": img = cv2.bitwise_not(img) # Debugging: Check if the frame is being processed print(f"Processing frame with filter: {filter}") return av.VideoFrame.from_ndarray(img, format="bgr24") # Streamlit buttons to choose filters col1, col2, col3, col4, col5, col6 = st.columns([1, 1, 1, 1, 1, 1]) with col1: if st.button("None"): filter = "none" with col2: if st.button("Blur"): filter = "blur" with col3: if st.button("Grayscale"): filter = "grayscale" with col4: if st.button("Sepia"): filter = "sepia" with col5: if st.button("Canny"): filter = "canny" with col6: if st.button("Invert"): filter = "invert" # WebRTC constraints for video resolution (optional) video_constraints = { "facing_mode": "user", # Use the front camera "width": {"ideal": 1280}, "height": {"ideal": 720} } # Display the video stream webrtc_streamer( key="streamer", video_frame_callback=transform, sendback_audio=False, video_constraints=video_constraints, # Optional: set constraints mode=WebRtcMode.SENDRECV # Ensure bidirectional communication (send/receive video) )