File size: 3,529 Bytes
a3f0f2d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c73813
dbdffeb
a3f0f2d
 
 
 
 
 
 
 
 
 
1c73813
 
1705ce6
 
 
1c73813
 
a3f0f2d
 
 
 
 
1705ce6
a3f0f2d
1c73813
 
4e37a66
1705ce6
a3f0f2d
4e37a66
a3f0f2d
830609c
 
 
a3f0f2d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1705ce6
 
3e282cd
a3f0f2d
1c73813
 
a3f0f2d
 
12bf67c
a3f0f2d
 
 
 
 
 
 
 
dbdffeb
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
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 = []
                for filter_name, control_list in controls.items():
                    group = gr.Group(visible=filter_name == "Original") # Create group here, outside with
                    filter_groups[filter_name] = group # Store group
                    with group: # Put controls inside the group
                        for component in control_list:
                            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.update(visible=visibility))  # Changed from 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=list(filter_groups.values()) # Pass list of groups as outputs
        )
        
        input_components_process = [input_image, filter_select] + control_components
        for component in [input_image, filter_select] + 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)