|
import streamlit as st |
|
from PIL import Image |
|
from ocr_engine import extract_weight_from_image |
|
import urllib.parse |
|
import uuid |
|
import io |
|
|
|
st.set_page_config(page_title="βοΈ Auto Weight Logger", layout="centered") |
|
st.title("βοΈ Auto Weight Logger") |
|
|
|
|
|
if "image_data" not in st.session_state: |
|
st.session_state.image_data = None |
|
if "input_mode" not in st.session_state: |
|
st.session_state.input_mode = "Camera" |
|
if "camera_key" not in st.session_state: |
|
st.session_state.camera_key = str(uuid.uuid4()) |
|
|
|
|
|
st.radio("πΈ Select Image Input Method:", ["Camera", "Upload"], key="input_mode", horizontal=True) |
|
|
|
|
|
if st.button("π Clear / Retake Photo"): |
|
st.session_state.image_data = None |
|
st.session_state.camera_key = str(uuid.uuid4()) |
|
|
|
|
|
uploaded_image = None |
|
|
|
if st.session_state.image_data is None: |
|
if st.session_state.input_mode == "Camera": |
|
uploaded_image = st.camera_input("π· Capture the weight display", key=st.session_state.camera_key) |
|
else: |
|
uploaded_image = st.file_uploader("π Upload an image of the weight display", type=["jpg", "jpeg", "png"]) |
|
|
|
if uploaded_image: |
|
st.session_state.image_data = uploaded_image |
|
|
|
|
|
if st.session_state.image_data: |
|
st.success("β
Image received successfully!") |
|
|
|
|
|
try: |
|
image_bytes = st.session_state.image_data.read() if hasattr(st.session_state.image_data, 'read') else st.session_state.image_data.getvalue() |
|
image = Image.open(io.BytesIO(image_bytes)) |
|
except Exception as e: |
|
st.error("β Failed to load image.") |
|
st.stop() |
|
|
|
st.image(image, caption="πΈ Snapshot", use_column_width=True) |
|
|
|
|
|
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..."): |
|
weight, confidence = extract_weight_from_image(image) |
|
|
|
st.write(f"π οΈ DEBUG: weight = {weight}, confidence = {confidence}") |
|
|
|
if not weight or confidence < 80: |
|
st.error(f"β οΈ OCR confidence too low ({int(confidence)}%). Please try again.") |
|
else: |
|
st.success(f"β
Detected Weight: {weight} g (Confidence: {int(confidence)}%)") |
|
|
|
|
|
device_id = "BAL-001" |
|
image_url = "" |
|
|
|
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 here to confirm and log in Salesforce]({salesforce_url})", unsafe_allow_html=True) |
|
|
|
|
|
if st.button("π Retake / Upload Another"): |
|
st.session_state.image_data = None |
|
st.session_state.camera_key = str(uuid.uuid4()) |
|
|