File size: 5,046 Bytes
5779747
 
 
 
5e4c3ce
 
29c477e
5e4c3ce
 
 
 
e50e82a
5779747
 
 
5e4c3ce
 
5779747
5e4c3ce
19de063
5779747
5e4c3ce
 
 
5779747
 
 
 
 
 
5e4c3ce
 
 
 
 
 
 
 
 
 
5779747
 
8e725cb
5e4c3ce
 
 
 
 
 
 
 
 
 
 
8e725cb
5779747
 
 
 
 
 
 
8e725cb
5779747
 
5e4c3ce
963c867
5e4c3ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c8ba898
 
 
 
 
 
e50e82a
5e4c3ce
 
 
 
5779747
8e725cb
 
5779747
 
 
 
 
 
 
19de063
 
 
 
 
 
 
5779747
8e725cb
5779747
 
 
 
 
 
 
5e4c3ce
 
 
 
 
 
 
 
 
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import streamlit as st
import pandas as pd
from datetime import datetime
import os
import threading
import time
from PIL import Image
from io import BytesIO
import base64
from imutils.video import VideoStream
import cv2

# 🌟πŸ”₯ Initialize session state like a galactic DJ spinning tracks!
if 'file_history' not in st.session_state:
    st.session_state['file_history'] = []
if 'auto_capture_running' not in st.session_state:
    st.session_state['auto_capture_running'] = False

# πŸ“œπŸ’Ύ Save to history like a time-traveling scribe!
def save_to_history(file_type, file_path, img_data):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    # Convert RGB to BGR for OpenCV saving
    img_bgr = cv2.cvtColor(img_data, cv2.COLOR_RGB2BGR)
    cv2.imwrite(file_path, img_bgr)
    st.session_state['file_history'].append({
        "Timestamp": timestamp,
        "Type": file_type,
        "Path": file_path
    })

# πŸ“Έβ° Auto-capture every 10 secs like a sneaky shutterbug!
def auto_capture(streams):
    while st.session_state['auto_capture_running']:
        for i, stream in enumerate(streams):
            frame = stream.read()
            if frame is not None:
                filename = f"cam{i}_auto_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
                save_to_history("πŸ–ΌοΈ Image", filename, frame)
        time.sleep(10)

# πŸŽ›οΈ Sidebar config like a spaceship control panel!
with st.sidebar:
    st.header("πŸŽšοΈπŸ“Έ Snap Shack")
    streams = [
        VideoStream(src=0).start(),  # Camera 0
        VideoStream(src=1).start()   # Camera 1
    ]
    if st.button("⏰ Start Auto-Snap"):
        st.session_state['auto_capture_running'] = True
        threading.Thread(target=auto_capture, args=(streams,), daemon=True).start()
    if st.button("⏹️ Stop Auto-Snap"):
        st.session_state['auto_capture_running'] = False

    # πŸ“‚ Sidebar file outline with emoji flair!
    st.subheader("πŸ“œ Snap Stash")
    if st.session_state['file_history']:
        images = [f for f in st.session_state['file_history'] if f['Type'] == "πŸ–ΌοΈ Image"]
        if images:
            st.write("πŸ–ΌοΈ Images")
            for img in images:
                st.write(f"- {img['Path']} @ {img['Timestamp']}")
    else:
        st.write("πŸ•³οΈ Empty Stash!")

# 🌍🎨 Main UI kicks off like a cosmic art show!
st.title("πŸ“Έ Imutils Snap Craze")

# πŸ“ΈπŸ“· Camera snap zone!
st.header("πŸ“ΈπŸŽ₯ Snap Zone")
cols = st.columns(2)
placeholders = [cols[0].empty(), cols[1].empty()]
for i, (placeholder, stream) in enumerate(zip(placeholders, streams)):
    frame = stream.read()
    if frame is not None:
        placeholder.image(frame, caption=f"Live Cam {i}", use_container_width=True)
    else:
        placeholder.error(f"🚨 No feed from Cam {i}. Check connection or index.")
    
    if st.button(f"πŸ“Έ Snap Cam {i}", key=f"snap{i}"):
        frame = stream.read()
        if frame is not None:
            filename = f"cam{i}_snap_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
            save_to_history("πŸ–ΌοΈ Image", filename, frame)
        else:
            st.error(f"🚨 Failed to snap Cam {i}")

# πŸ“‚ Upload zone like a media drop party!
st.header("πŸ“₯πŸŽ‰ Drop Zone")
uploaded_files = st.file_uploader("πŸ“Έ Toss Pics", accept_multiple_files=True, type=['jpg', 'png'])
if uploaded_files:
    for uploaded_file in uploaded_files:
        file_path = f"uploaded_{uploaded_file.name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg"
        img = Image.open(uploaded_file)
        img_array = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)  # Convert for consistency
        save_to_history("πŸ–ΌοΈ Image", file_path, img_array)
        st.image(img, caption=uploaded_file.name, use_container_width=True)

# πŸ–ΌοΈ Gallery like a media circus!
st.header("πŸŽͺ Snap Show")
if st.session_state['file_history']:
    images = [f for f in st.session_state['file_history'] if f['Type'] == "πŸ–ΌοΈ Image"]
    if images:
        st.subheader("πŸ–ΌοΈ Pic Parade")
        cols = st.columns(3)
        for i, img in enumerate(images):
            with cols[i % 3]:
                if os.path.exists(img['Path']):
                    st.image(img['Path'], caption=img['Path'], use_container_width=True)
                    with open(img['Path'], "rb") as f:
                        img_data = f.read()
                    st.markdown(f'<a href="data:image/jpeg;base64,{base64.b64encode(img_data).decode()}" download="{os.path.basename(img["Path"])}">πŸ“₯ Snag It!</a>', unsafe_allow_html=True)
                else:
                    st.warning(f"🚨 Missing file: {img['Path']}")
else:
    st.write("🚫 No snaps yet!")

# πŸ“œ History log like a time machine!
st.header("⏳ Snap Saga")
if st.session_state['file_history']:
    df = pd.DataFrame(st.session_state['file_history'])
    st.dataframe(df)
else:
    st.write("πŸ•³οΈ Nothing snapped yet!")

# Cleanup on app exit
def cleanup():
    for stream in streams:
        stream.stop()

import atexit
atexit.register(cleanup)