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