File size: 3,435 Bytes
fb1a823 1a717ad 17e765d 7be0446 1a717ad 8578b51 fb1a823 8578b51 7be0446 d54c470 8578b51 7be0446 e667809 ae762c2 8578b51 7be0446 8578b51 7be0446 e667809 3ced6b6 7be0446 8578b51 7be0446 8578b51 7be0446 8578b51 3ced6b6 7be0446 e667809 7be0446 8578b51 7be0446 e667809 3ced6b6 e667809 3ced6b6 8578b51 7be0446 17e765d 7be0446 3ced6b6 8578b51 3ced6b6 7be0446 8578b51 7be0446 8578b51 7be0446 8578b51 7be0446 8578b51 7be0446 8578b51 7be0446 8578b51 7be0446 8578b51 3ced6b6 7be0446 3ced6b6 7be0446 3ced6b6 7be0446 1a717ad 8578b51 51be189 e667809 51be189 |
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 |
import streamlit as st
from PIL import Image, UnidentifiedImageError
import io
import uuid
import urllib.parse
from datetime import datetime
import pytz
from ocr_engine import extract_weight_from_image # Make sure this returns (weight, confidence)
# Set up page
st.set_page_config(page_title="βοΈ Auto Weight Logger", layout="centered")
st.title("βοΈ Auto Weight Logger")
# Session state keys
if "camera_key" not in st.session_state:
st.session_state.camera_key = str(uuid.uuid4())
if "captured_time" not in st.session_state:
st.session_state.captured_time = ""
# Get IST time
def get_current_ist_time():
ist = pytz.timezone("Asia/Kolkata")
return datetime.now(ist).strftime("%Y-%m-%d %I:%M:%S %p")
# Input selection
input_mode = st.radio("πΈ Select Input Method", ["Camera", "Upload"], horizontal=True)
# Retake button
if st.button("π Clear / Retake"):
st.session_state.camera_key = str(uuid.uuid4())
st.session_state.captured_time = ""
st.rerun()
# Image handling
image_bytes = None
image = None
# Webcam input
if input_mode == "Camera":
cam_photo = st.camera_input("π· Capture Weight Display", key=st.session_state.camera_key)
if cam_photo:
image_bytes = cam_photo.getvalue()
st.session_state.captured_time = get_current_ist_time()
# File upload
elif input_mode == "Upload":
uploaded_file = st.file_uploader("π Upload an image (JPG/PNG)", type=["jpg", "jpeg", "png"])
if uploaded_file:
image_bytes = uploaded_file.read()
st.session_state.captured_time = get_current_ist_time()
# Process and display
if image_bytes:
try:
image = Image.open(io.BytesIO(image_bytes))
# 1. Show Captured At
st.markdown(f"### π Captured At (IST): `{st.session_state.captured_time}`")
# 2. Show Snapshot Image
st.markdown("### πΌοΈ Snapshot Image")
st.image(image, use_column_width=True)
# 3. Extract OCR and show result
if len(image_bytes) > 5 * 1024 * 1024:
st.error("β Image too large (>5MB). Please upload a smaller image.")
st.stop()
with st.spinner("π Extracting weight using OCR..."):
weight, confidence = extract_weight_from_image(image)
st.markdown("### βοΈ Captured Weight & OCR Confidence")
if not weight or confidence < 80:
st.error(f"β οΈ Low OCR Confidence ({int(confidence)}%). Please retake or upload a clearer image.")
st.markdown("**Detected Weight:** Not reliable")
else:
st.success(f"β
Detected Weight: `{weight} g`")
st.markdown(f"**Confidence:** `{int(confidence)}%`")
# 4. Send to Salesforce
device_id = "BAL-001"
image_url = "" # optional
salesforce_url = (
"https://autoweightlogger-dev-ed.my.salesforce-sites.com/"
f"weight_logger_page?WeightInput={urllib.parse.quote(str(weight))}"
f"&DeviceID={urllib.parse.quote(device_id)}&ImageURL={urllib.parse.quote(image_url)}"
)
st.markdown("### β
Send to Salesforce")
st.markdown(f"[π€ Click to Log Weight in Salesforce]({salesforce_url})", unsafe_allow_html=True)
except UnidentifiedImageError:
st.error("β Unable to process image. Please upload a valid JPG or PNG.")
except Exception as e:
st.error("β Unexpected error.")
st.exception(e)
|