File size: 2,346 Bytes
cde08ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import cv2
import numpy as np
from PIL import Image

block = gr.Blocks(
            title="SAM and others",
            # theme="shivi/calm_seafoam@>=0.0.1,<1.0.0",
        )
colors = [(255, 0, 0), (0, 255, 0)]
markers = [1, 5]

def get_point(img, sel_pix, evt: gr.SelectData):
        img = np.array(img, dtype=np.uint8)
        sel_pix.append(evt.index)
        # draw points
        
        print(sel_pix)
        for point in sel_pix:
            cv2.drawMarker(img, point, colors[0], markerType=markers[0], markerSize=6, thickness=2)
        return Image.fromarray(img).convert("RGB")



def undo_button(orig_img, sel_pix):
    temp = orig_img.copy()
    temp = np.array(temp, dtype=np.uint8)
    if len(sel_pix) != 0:
        sel_pix.pop()
        for point in sel_pix:
            cv2.drawMarker(temp, point, colors[0], markerType=markers[0], markerSize=6, thickness=2)
    return Image.fromarray(temp).convert("RGB")

def toggle_button(orig_img, mode):
    print(mode)
    if mode:
        ret = gr.Image(value= orig_img,elem_id="image_upload", type='pil', label="Upload", height=512, tool = "editor")# tool = "sketch", brush_color='#00FFFF', mask_opacity=0.6)
    else:
        ret = gr.Image(value = orig_img, elem_id="image_upload", type='pil', label="Upload", height=512, tool = "sketch", brush_color='#00FFFF', mask_opacity=0.6)
    mode = not mode    
    return ret, mode
    
def store_img(img):
    print("call for store")
    return img, []  # when new image is uploaded, `selected_points` should be empty
    
with block:
    selected_points = gr.State([])
    original_image = gr.State()
    mode = gr.State(True)
    input_image = gr.Image(elem_id="image_upload", type='pil', label="Upload", height=512,)# tool = "sketch", brush_color='#00FFFF', mask_opacity=0.6)
    undo = gr.Button("undo mode", visible=True)
    toggle = gr.Button("toggle mode", visible=True)
    input_image.upload(
        store_img,
        [input_image],
        [original_image, selected_points]
    )

    input_image.select(
        get_point,
        [input_image, selected_points],
        [input_image]
    )   

    undo.click(fn=undo_button, inputs=[original_image, selected_points], outputs=[input_image])
    toggle.click(fn=toggle_button, inputs=[original_image, mode], outputs=[input_image, mode])
    
block.launch()