File size: 3,880 Bytes
bce068f
 
eaa4e30
bce068f
4a7ddd0
15d5948
 
3a97db5
15d5948
4a7ddd0
bce068f
3a97db5
4a7ddd0
15d5948
4a7ddd0
3a97db5
 
4a7ddd0
15d5948
bce068f
3a97db5
 
 
 
15d5948
 
3a97db5
 
 
bce068f
 
 
 
 
 
 
 
 
 
 
 
 
15d5948
 
bce068f
15d5948
 
3a97db5
15d5948
bce068f
15d5948
 
 
3a97db5
bce068f
 
 
 
 
 
 
 
 
 
 
 
 
15d5948
 
3a97db5
bce068f
3889969
bce068f
3a97db5
3889969
 
 
3a97db5
3889969
 
 
 
3a97db5
3889969
 
 
3a97db5
3889969
3a97db5
 
bce068f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# app.py

import streamlit as st
from processor import process_image, process_video, process_frame
import os
from PIL import Image
import tempfile
from streamlit_webrtc import VideoTransformerBase, webrtc_streamer, RTCConfiguration
import cv2

# Set page configuration
st.set_page_config(page_title="Traffic Violation Detection", layout="wide")

st.title("🚦 Traffic Violation Detection App")

# Sidebar options
option = st.sidebar.radio("Select Option:", ("Image", "Video", "Live Camera"))

if option == "Image":
    st.header("πŸ–ΌοΈ Upload and Process Image")
    uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
    if uploaded_file:
        image = Image.open(uploaded_file)
        st.image(image, caption='Uploaded Image.', use_column_width=True)
        if st.button("Process Image"):
            with st.spinner("Processing..."):
                with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp:
                    image.save(tmp.name)
                    frame = cv2.imread(tmp.name)
                processed = process_image(tmp.name, "fonts/alfont_com_arial-1.ttf")
                if processed is not None:
                    st.image(processed, caption='Processed Image.', use_column_width=True)
                    # Save processed image to temporary file for download
                    _, img_encoded = cv2.imencode('.jpg', processed)
                    st.download_button(
                        label="πŸ“₯ Download Image",
                        data=img_encoded.tobytes(),
                        file_name="processed_image.jpg",
                        mime="image/jpeg"
                    )
                else:
                    st.error("Failed to process the image.")

elif option == "Video":
    st.header("πŸŽ₯ Select and Process Video")
    video_files = [f for f in os.listdir("videos") if f.endswith(('.mp4', '.avi', '.mov'))]
    if not video_files:
        st.warning("No videos found in the 'videos/' folder.")
    else:
        selected_video = st.selectbox("Choose a video to process:", video_files)
        video_path = os.path.join("videos", selected_video)
        st.video(video_path)
        if st.button("Process Video"):
            with st.spinner("Processing Video..."):
                processed_path = process_video(video_path, "fonts/alfont_com_arial-1.ttf")
                if processed_path and os.path.exists(processed_path):
                    st.success("Video processed successfully!")
                    st.video(processed_path)
                    with open(processed_path, "rb") as file:
                        st.download_button(
                            label="πŸ“₯ Download Processed Video",
                            data=file,
                            file_name="processed_video.mp4",
                            mime="video/mp4"
                        )
                else:
                    st.error("Failed to process the video.")

elif option == "Live Camera":
    st.header("πŸ“· Live Camera Feed")
    st.info("Live processing is active. Detected violations will be annotated on the video feed.")

    # RTC Configuration for streamlit-webrtc
    RTC_CONFIGURATION = RTCConfiguration({"iceServers": [{"urls": ["stun:stun.l.google.com:19302"]}]})

    class VideoTransformer(VideoTransformerBase):
        def __init__(self):
            self.font_path = "fonts/alfont_com_arial-1.ttf"

        def transform(self, frame):
            img = frame.to_ndarray(format="bgr24")
            processed_img = process_frame(img, self.font_path)
            return processed_img

    webrtc_ctx = webrtc_streamer(
        key="live-camera",
        rtc_configuration=RTC_CONFIGURATION,
        video_transformer_factory=VideoTransformer,
        media_stream_constraints={"video": True, "audio": False},
        async_transform=True
    )