File size: 2,129 Bytes
7eebac0
42a8761
 
 
 
9f95f84
97f0d9d
9f95f84
 
 
9c14df6
9f95f84
 
 
 
 
 
 
870f731
97f0d9d
9f95f84
 
 
97f0d9d
9f95f84
 
97f0d9d
42a8761
 
 
 
 
 
 
 
 
 
 
 
870f731
 
bcbdd06
 
 
42a8761
09c4a22
42a8761
3f8e34c
e036d14
42a8761
 
a9852e7
9021e4d
42a8761
 
 
e036d14
513f538
9021e4d
e1b1c67
 
 
 
42a8761
 
 
3ea24a6
42a8761
 
931bb21
 
 
 
42a8761
3ea24a6
 
 
 
 
 
 
 
931bb21
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
import gradio as gr
import cv2
import numpy as np

def preprocess(img):
    # Convert to grayscale
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imwrite("1_gray.png", img_gray)

    # Blur the image
    img_blur = cv2.GaussianBlur(img_gray, (3, 3), 1)
    cv2.imwrite("2_blur.png", img_blur)

    # Detect edges with Canny
    img_canny = cv2.Canny(img_blur, 50, 50)
    cv2.imwrite("3_canny.png", img_canny)

    # Dilate the edges
    kernel = np.ones((3, 3))
    img_dilate = cv2.dilate(img_canny, kernel, iterations=2)
    cv2.imwrite("4_dilate.png", img_dilate)

    # Erode the dilated edges
    img_erode = cv2.erode(img_dilate, kernel, iterations=1)
    cv2.imwrite("5_erode.png", img_erode)

    return img_erode

def find_tip(points, convex_hull):
    length = len(points)
    indices = np.setdiff1d(range(length), convex_hull)

    for i in range(2):
        j = indices[i] + 2
        if j > length - 1:
            j = length - j
        if np.all(points[j] == points[indices[i - 1] - 2]):
            return tuple(points[j])






def infer(image_in):
    img = cv2.imread(image_in)

    contours, hierarchy = cv2.findContours(preprocess(img), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    

    for cnt in contours:
        peri = cv2.arcLength(cnt, True)
        approx = cv2.approxPolyDP(cnt, 0.024 * peri, True)
        hull = cv2.convexHull(approx, returnPoints=False)
        sides = len(hull)

        

        if 6 > sides > 3 and sides + 2 == len(approx):
            arrow_tip = find_tip(approx[:,0,:], hull.squeeze())
            if arrow_tip:
                cv2.drawContours(img, [cnt], -1, (0, 255, 0), 3)
                cv2.circle(img, arrow_tip, 3, (0, 0, 255), cv2.FILLED)

    cv2.imwrite("Image_result.png", img)

    return "Image_result.png", "1_gray.png", "2_blur.png", "3_canny.png", "4_dilate.png", "5_erode.png"

gr.Interface(
    fn=infer,
    inputs=gr.Image(
        sources=["upload"],
        type="filepath"
    ),
    outputs=[
        gr.Image(),
        gr.Image(),
        gr.Image(),
        gr.Image(),
        gr.Image(),
        gr.Image(),
    ]
).launch()