Spaces:
Running
Running
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) |