Spaces:
Sleeping
Sleeping
| # app.py | |
| import streamlit as st | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| import easyocr | |
| from streamlit_paste_button import paste_image_button as pbutton | |
| color_ranges = { | |
| 'fire': 'B50B0E', | |
| 'water': '015AB6', | |
| 'wind': '1F6A0B', | |
| 'earth': '623F23', | |
| 'light': 'DA8D09', | |
| 'dark': '502181' | |
| } | |
| def hex_to_rgb(hex_code): | |
| return tuple(int(hex_code[i:i+2], 16) for i in (0, 2, 4)) | |
| # ์บ์ฑ์ผ๋ก Reader๋ฅผ ํ ๋ฒ๋ง ๋ก๋ | |
| def load_reader(): | |
| return easyocr.Reader(['en'], gpu=False, verbose=False) | |
| def extract_number(region, reader): | |
| try: | |
| gray = cv2.cvtColor(region, cv2.COLOR_BGR2GRAY) | |
| resized = cv2.resize(gray, None, fx=6, fy=6, interpolation=cv2.INTER_CUBIC) | |
| results = reader.readtext(resized, allowlist='0123456789', paragraph=False) | |
| if results: | |
| text = results[0][1] | |
| return int(text.strip()) | |
| except Exception as e: | |
| st.error(f"์ซ์ ์ถ์ถ ์ค๋ฅ: {e}") | |
| return 0 | |
| def find_items(img_array, color_range, reader): | |
| img_rgb = cv2.cvtColor(img_array, cv2.COLOR_BGR2RGB) | |
| results = {} | |
| for type, hex_color in color_range.items(): | |
| target_rgb = hex_to_rgb(hex_color) | |
| lower_c = np.array([max(0, c - 10) for c in target_rgb]) | |
| upper_c = np.array([min(255, c + 10) for c in target_rgb]) | |
| mask = cv2.inRange(img_rgb, lower_c, upper_c) | |
| contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) | |
| if contours: | |
| largest = max(contours, key=cv2.contourArea) | |
| if cv2.contourArea(largest) > 100: | |
| x, y, w, h = cv2.boundingRect(largest) | |
| number_region = img_rgb[y+h:y+int(h*2), x+w:x+int(w*2.3)] | |
| count = extract_number(number_region, reader) | |
| results[type] = count | |
| else: | |
| results[type] = 0 | |
| else: | |
| results[type] = 0 | |
| return results | |
| def process_image(img): | |
| st.image(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), caption='์ ๋ก๋๋ ์ด๋ฏธ์ง', use_container_width=True) | |
| with st.spinner('์์ดํ ๊ฐ์๋ฅผ ์ธ๋ ์ค... (์ฒ์ ์คํ์ ๋ชจ๋ธ ๋ก๋ฉ์ผ๋ก ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค)'): | |
| try: | |
| reader = load_reader() | |
| results = find_items(img, color_ranges, reader) | |
| # ๊ฒฐ๊ณผ ํ์ | |
| st.success('โ ๋ถ์ ์๋ฃ!') | |
| col1, col2, col3 = st.columns(3) | |
| emoji_map = { | |
| 'fire': '๐ฅ', | |
| 'water': '๐ง', | |
| 'wind': '๐จ', | |
| 'earth': '๐', | |
| 'light': 'โจ', | |
| 'dark': '๐' | |
| } | |
| korean_map = { | |
| 'fire': '๋ถ', | |
| 'water': '๋ฌผ', | |
| 'wind': '๋ฐ๋', | |
| 'earth': '๋์ง', | |
| 'light': '๋น', | |
| 'dark': '์ด๋ ' | |
| } | |
| # ๋จ์ผ ์ด๋ก ํ์ | |
| for type, count in results.items(): | |
| st.metric( | |
| label=f"{emoji_map.get(type, '')} {korean_map.get(type, type)}", | |
| value=f"{count}๊ฐ" | |
| ) | |
| # cols = [col1, col2, col3] | |
| # counts_str = '' | |
| # for idx, (type, count) in enumerate(results.items()): | |
| # col = cols[idx % 3] | |
| # with col: | |
| # st.metric( | |
| # label=f"{emoji_map.get(type, '')} {korean_map.get(type, type)}", | |
| # value=f"{count}๊ฐ" | |
| # ) | |
| counts_str += f"{count}/" | |
| st.markdown(f'{counts_str}') | |
| except Exception as e: | |
| st.error(f"๋ถ์ ์ค ์ค๋ฅ ๋ฐ์: {e}") | |
| st.info("EasyOCR ๋ชจ๋ธ ๋ก๋ฉ์ ์คํจํ์ ์ ์์ต๋๋ค. Streamlit Cloud์ ๋ฉ๋ชจ๋ฆฌ ์ ํ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.") | |
| # Streamlit UI | |
| st.set_page_config(page_title="๊ฒ์ ์์ดํ ์นด์ดํฐ", page_icon="๐ฎ") | |
| st.title('๐ฎ ๊ฒ์ ์์ดํ ์นด์ดํฐ') | |
| st.write('ํ๋ํ ์์ฑ ์์ดํ ๊ฐ์๋ฅผ ์๋์ผ๋ก ์ธ์ด๋๋ฆฝ๋๋ค!') | |
| tab1, tab2 = st.tabs(["๐ ํ์ผ ์ ๋ก๋", "๐ ๋ถ์ฌ๋ฃ๊ธฐ"]) | |
| with tab1: | |
| st.write('์ด๋ฏธ์ง ํ์ผ์ ์ ๋ก๋ํ์ธ์') | |
| uploaded_file = st.file_uploader("์คํฌ๋ฆฐ์ท์ ์ ๋ก๋ํ์ธ์", type=['png', 'jpg', 'jpeg']) | |
| if uploaded_file is not None: | |
| file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8) | |
| img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR) | |
| process_image(img) | |
| with tab2: | |
| st.write('์ด๋ฏธ์ง๋ฅผ ๋ถ์ฌ๋ฃ์ผ์ธ์') | |
| paste_result = pbutton( | |
| label="๐ ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ๊ณ Ctrl+V", | |
| background_color="#FF4B4B", | |
| hover_background_color="#FF6B6B", | |
| ) | |
| if paste_result.image_data is not None: | |
| pil_image = paste_result.image_data | |
| # st.markdown(f'{type(pil_image)}') | |
| img = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) | |
| process_image(img) | |
| st.markdown('---') | |
| st.caption('Made by โค๏ธsseong') |