import gradio as gr import cv2 import numpy as np from registry import registry from filters import * from components import create_filter_controls def create_app(): with gr.Blocks() as app: gr.Markdown("# 📷 Real-Time Photo Filter App") # Khởi tạo components controls = create_filter_controls() filter_names = list(registry.filters.keys()) filter_groups = {} # Store filter groups with gr.Row(): with gr.Column(): input_image = gr.Image(label="Input Image", type="numpy") filter_select = gr.Dropdown( label="Select Filter", choices=filter_names, value="Original" ) # Thêm các control vào UI control_components = [] filter_groups = controls # Assign controls directly to filter_groups for filter_name, group in filter_groups.items(): # Iterate through groups with group: # Put controls inside the group for component in group.children: control_components.append(component) # Collect sliders for event handling with gr.Column(): output_image = gr.Image(label="Filtered Image") # Xử lý cập nhật UI def update_controls(filter_name): updates = [] for group_name, group in filter_groups.items(): visibility = (group_name == filter_name) updates.append(gr.Group.update(visible=visibility)) # Use gr.Group.update return updates # Xử lý ảnh real-time def process(*args, **kwargs): image = args[0] if len(args) > 0 else None filter_name = args[1] if len(args) > 1 else "Original" # Default filter if image is None: return None try: image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) params = { k.split('_', 1)[1]: v for k, v in kwargs.items() if k.startswith(filter_name) } processed = registry.filters[filter_name](image, **params) if len(processed.shape) == 2: processed = cv2.cvtColor(processed, cv2.COLOR_GRAY2RGB) else: processed = cv2.cvtColor(processed, cv2.COLOR_BGR2RGB) return processed except Exception as e: print(f"Error processing image: {e}") return image # Kết nối sự kiện filter_select.change( update_controls, inputs=filter_select, outputs=[filter_groups[name] for name in filter_groups] # Pass list of groups as outputs ) input_components_process = [input_image, filter_select] + control_components filter_select.change( # Attach change to filter_select process, inputs=input_components_process, outputs=output_image, show_progress=False ) for component in control_components: # Attach change to sliders component.change( process, inputs=input_components_process, outputs=output_image, show_progress=False ) return app if __name__ == "__main__": app = create_app() app.launch(share=True)