I am working with code that was taken from this answer: Detect text region in image using Opencv
The code I am working with is:
import cv2
def captch_ex(file_name ):
img = cv2.imread(file_name)
img_final = cv2.imread(file_name)
img2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY)
image_final = cv2.bitwise_and(img2gray , img2gray , mask = mask)
ret, new_img = cv2.threshold(image_final, 180 , 255, cv2.THRESH_BINARY) # for black text , cv.THRESH_BINARY_INV
'''
line 8 to 12 : Remove noisy portion
'''
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3 , 3)) # to manipulate the orientation of dilution , large x means horizonatally dilating more, large y means vertically dilating more
dilated = cv2.dilate(new_img,kernel,iterations = 9) # dilate , more the iteration more the dilation
contours = cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0] # get contours
index = 0
for contour in contours:
# get rectangle bounding contour
[x,y,w,h] = cv2.boundingRect(contour)
#Don't plot small false positives that aren't text
if w < 35 and h<35:
continue
# draw rectangle around contour on original image
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,255),2)
#you can crop image and send to OCR , false detected will return no text :)
cropped = img_final[y :y + h , x : x + w]
s = file_name + 'crop_' + str(index) + '.png'
cv2.imwrite(s , cropped)
index = index + 1
# write original image with added contours to disk
file_name ='rec_5.png'
captch_ex(file_name)
The biggest difference to point out is the following:
contours = cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]
The [0]
was added because I kept receiving this error without it
Traceback (most recent call last):
File "test2.py", line 38, in <module>
captch_ex(file_name)
File "test2.py", line 20, in captch_ex
[x,y,w,h] = cv2.boundingRect(contour)
TypeError: points is not a numpy array, neither a scalar
Unfortunately, I can't find the source, but I read somewhere that there was a change in this method for version 3 and now this is required.
My issue is that when I feed this function an image I receive hundreds of 1 px.
width cropped images, that do not accomplish what the function apparently solved in the referenced answer.
As of right now I am guessing that the additional [0]
noted above could potentially be the cause of the error, but without it I can get the script to complete.