image2text_ocr / app.py
Orkhan's picture
Duplicate from JackWrion/OCR
14607dc
import os
import gradio as gr
import cv2
import pytesseract
from fastapi import FastAPI
#pytesseract.pytesseract.tesseract_cmd = r'./Tesseract-OCR/tesseract.exe'
print(os.popen(f'cat /etc/debian_version').read())
print(os.popen(f'cat /etc/issue').read())
print(os.popen(f'apt search tesseract').read())
def TextLineBox(img):
class Lines:
def __init__(self,x,y,w,h,text):
self.x = x
self.y = y
self.w = w
self.h = h
self.text = text
lineboxes = []
#read image
img = cv2.GaussianBlur(img,(3,3),0)
### Cofig
configname = r' --oem 3 --psm ' + str(12) + ' -l eng'
#### Text for testing
texttest = pytesseract.image_to_string(img ,config=configname)
### Box of words
boxes = pytesseract.image_to_data(img, config=configname)
# print(boxes)
#slit box and concatenate into line
skip = 0
for b in boxes.splitlines():
## skip header
if (skip == 0):
skip = 1
continue
## get box of word in 1 object
b = b.split()
if (len(b) < 12): ## it is a space not a word
continue
#print(b)
x,y,w,h,text = int(b[6]),int(b[7]),int(b[8]),int(b[9]), b[11]
### Begin New line if the word having num_word is 1
if (int(b[5]) == 1):
lineboxes.append( Lines(x,y,w,h,text) )
### Next word inline
else:
lineboxes[-1].text += ' ' + text
if (x > lineboxes[-1].x):
lineboxes[-1].w = x - lineboxes[-1].x + w
if (y < lineboxes[-1].y):
lineboxes[-1].y = y
if (y+h > lineboxes[-1].y + lineboxes[-1].h):
lineboxes[-1].h = y+h - lineboxes[-1].y
#draw the box of WORD
cv2.rectangle(img, (x,y) , (w+x,y+h), (255,0,0), 2 )
return texttest,img
def Download(text):
with open("test.txt", "w") as file:
file.write(text)
return "test.txt"
with gr.Blocks (theme="ParityError/Anime" , css="#SUBMIT {background-color: #cdb4db} #DOWNLOAD {background-color: #a2d2ff}") as demo:
with gr.Row():
with gr.Column():
input = gr.Image()
text_output = gr.Text(label="Result Text")
file_output = gr.File()
with gr.Row():
submit_btn = gr.Button("SUBMIT" , elem_id="SUBMIT")
download_btn = gr.Button("DOWNLOAD", elem_id="DOWNLOAD")
clear_btn = gr.Button("CLEAR")
with gr.Column():
image_output = gr.Image()
submit_btn.click(TextLineBox, input, outputs= [text_output, image_output, ] )
download_btn.click(Download, text_output, outputs= file_output )
clear_btn.click(lambda: [None,None,None], inputs=None, outputs= [text_output, file_output, image_output])
demo.load(
None,
None,
_js="""
() => {
const params = new URLSearchParams(window.location.search);
if (!params.has('__theme')) {
params.set('__theme', 'dark');
window.location.search = params.toString();
}
}""",
)
demo.queue().launch()
# Cach 1 dung app Gradio (share = True)
# Cach 2 dung Mount_Gradio_app trong FASTAPI app
# Cach 3
# app = FastAPI()
# app = gr.mount_gradio_app(app, demo, path="/OCR" )
#bt.click(fn=None, _js="window.open('https://google.com', '_blank')")