File size: 3,851 Bytes
a383d0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import pytesseract as pyt
import cv2

import lib_ip.ip_draw as draw
from config.CONFIG_UIED import Config

C = Config()


def is_text(img, min_word_area, show=False):
    broad = img.copy()
    area_word = 0
    area_total = img.shape[0] * img.shape[1]

    try:
        # ocr text detection
        data = pyt.image_to_data(img).split('\n')
    except:
        print(img.shape)
        return -1
    word = []
    for d in data[1:]:
        d = d.split()
        if d[-1] != '-1':
            if d[-1] != '-' and d[-1] != '—' and int(d[-3]) < 50 and int(d[-4]) < 100:
                word.append(d)
                t_l = (int(d[-6]), int(d[-5]))
                b_r = (int(d[-6]) + int(d[-4]), int(d[-5]) + int(d[-3]))
                area_word += int(d[-4]) * int(d[-3])
                cv2.rectangle(broad, t_l, b_r, (0,0,255), 1)

    if show:
        for d in word: print(d)
        print(area_word/area_total)
        cv2.imshow('a', broad)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    # no text in this clip or relatively small text area
    if len(word) == 0 or area_word/area_total < min_word_area:
        return False
    return True


def text_detection(org, img_clean):
    try:
        data = pyt.image_to_data(img_clean).split('\n')
    except:
        return org, None
    corners_word = []
    for d in data[1:]:
        d = d.split()
        if d[-1] != '-1':
            if d[-1] != '-' and d[-1] != '—' and 5 < int(d[-3]) < 40 and 5 < int(d[-4]) < 100:
                t_l = (int(d[-6]), int(d[-5]))
                b_r = (int(d[-6]) + int(d[-4]), int(d[-5]) + int(d[-3]))
                corners_word.append((t_l, b_r))
    return corners_word


# def text_merge_word_into_line(org, corners_word, max_words_gap=C.THRESHOLD_TEXT_MAX_WORD_GAP):
#
#     def is_in_line(word):
#         for i in range(len(lines)):
#             line = lines[i]
#             # at the same row
#             if abs(line['center'][1] - word['center'][1]) < max_words_gap:
#                 # small gap between words
#                 if (abs(line['center'][0] - word['center'][0]) - abs(line['width']/2 + word['width']/2)) < max_words_gap:
#                     return i
#         return -1
#
#     def merge_line(word, index):
#         line = lines[index]
#         # on the left
#         if word['center'][0] < line['center'][0]:
#             line['col_min'] = word['col_min']
#         # on the right
#         else:
#             line['col_max'] = word['col_max']
#         line['row_min'] = min(line['row_min'], word['row_min'])
#         line['row_max'] = max(line['row_max'], word['row_max'])
#         line['width'] = line['col_max'] - line['col_min']
#         line['height'] = line['row_max'] - line['row_min']
#         line['center'] = ((line['col_max'] + line['col_min'])/2, (line['row_max'] + line['row_min'])/2)
#
#     words = []
#     for corner in corners_word:
#         word = {}
#         (top_left, bottom_right) = corner
#         (col_min, row_min) = top_left
#         (col_max, row_max) = bottom_right
#         word['col_min'], word['col_max'], word['row_min'], word['row_max'] = col_min, col_max, row_min, row_max
#         word['height'] = row_max - row_min
#         word['width'] = col_max - col_min
#         word['center'] = ((col_max + col_min)/2, (row_max + row_min)/2)
#         words.append(word)
#
#     lines = []
#     for word in words:
#         line_index = is_in_line(word)
#         # word is in current line
#         if line_index != -1:
#             merge_line(word, line_index)
#         # word is not in current line
#         else:
#             # this single word as a new line
#             lines.append(word)
#
#     corners_line = []
#     for l in lines:
#         corners_line.append(((l['col_min'], l['row_min']), (l['col_max'], l['row_max'])))
#     return corners_line