Search code examples
pythonopencvtesseract

How to paint a rectangle over words?


I want rectangles to be painted over the original words and put new words on top of them, but when i do that the main rectangle is painted full screen, how to exclude it from painting?

https://i.sstatic.net/SmUca.jpg - before painting

https://i.sstatic.net/1KGqF.jpg - after painting

img = cv2.imread('C:\\Users\\booba\\PycharmProjects\\MySchoolProject\\21.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

config = r'--oem 3 --psm 4'
data = pytesseract.image_to_data(img, config=config, lang='eng')

for i, el in enumerate(data.splitlines()):
if i == 0:
    continue
el = el.split()
try:
    x, y, w, h = int(el[6]), int(el[7]), int(el[8]), int(el[9])
    a = cv2.rectangle(img, (x,y), (w + x, h + y), (0, 0, 255), 2)
    font = cv2.FONT_HERSHEY_COMPLEX

    print(el[11])
    cv2.putText(img, el[11], (x, y), font, 1, (0,0,0), 3)
    cv2.putText(img, el[11], (x, y), font, 1, (255, 255, 255), 2)

except IndexError:
    continue

Solution

  • You can check if a text is included in the line data:

    
    import cv2
    import pytesseract
    
    img = cv2.imread('test-ocr.png')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    config = r'--oem 3 --psm 4'
    data = pytesseract.image_to_data(img, config=config, lang='eng')
    print(data)
    for i, line in enumerate(data.splitlines()):
        if i == 0:
            # ignore header line
            continue
    
        el = line.split()
        x, y, w, h = int(el[6]), int(el[7]), int(el[8]), int(el[9])
        if len(el) > 11:
            text = el[11]
            if text:
                # only draw box if text was found
                a = cv2.rectangle(img, (x,y), (w + x, h + y), (0, 0, 255), 2)
                font = cv2.FONT_HERSHEY_COMPLEX
    
                cv2.putText(img, text, (x, y), font, 1, (0,0,0), 3)
                cv2.putText(img, text, (x, y), font, 1, (255, 255, 255), 2)
    
    cv2.imwrite('boxes.png', img)