Ask Your Question

Revision history [back]

i hope this will help you (i am not a python coder)

some code taken and modified from https://github.com/Breta01/handwriting-ocr/blob/master/src/ocr/words.py

image description

from imutils import contours
import imutils
import cv2

def union(a,b):
    x = min(a[0], b[0])
    y = min(a[1], b[1])
    w = max(a[0]+a[2], b[0]+b[2]) - x
    h = max(a[1]+a[3], b[1]+b[3]) - y
    return [x, y, w, h]

def _intersect(a,b):
    x = max(a[0], b[0])
    y = max(a[1], b[1])
    w = min(a[0]+a[2], b[0]+b[2]) - x
    h = min(a[1]+a[3], b[1]+b[3]) - y
    if h<0:                                              # in original code :  if w<0 or h<0:
        return False
    return True

def _group_rectangles(rec):
    """
    Uion intersecting rectangles.
    Args:
        rec - list of rectangles in form [x, y, w, h]
    Return:
        list of grouped ractangles 
    """
    tested = [False for i in range(len(rec))]
    final = []
    i = 0
    while i < len(rec):
        if not tested[i]:
            j = i+1
            while j < len(rec):
                if not tested[j] and _intersect(rec[i], rec[j]):
                    rec[i] = union(rec[i], rec[j])
                    tested[j] = True
                    j = i
                j += 1
            final += [rec[i]]
        i += 1

    return final

img = cv2.imread('e:/test/hr-ocr.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# threshold image
ret, threshed_img = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY_INV)

# find contours and get the external one

#edged = imutils.auto_canny(threshed_img)

ctrz = cv2.findContours(threshed_img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(ctrz)
(cnts, boundingBoxes) = imutils.contours.sort_contours(cnts, method="left-to-right")
boundingBoxes = list(boundingBoxes)
boundingBoxes = _group_rectangles(boundingBoxes)

for (x, y, w, h) in boundingBoxes:
    cv2.rectangle(img, (x, y),(x+w,y+h), (0, 255, 0), 2)

cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyWindow('img')