1 | initial version |
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
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')