I'm trying to use OpenCV to extract tags from Nike images. This is a tutorial code taken from:
http://opencv-code.com/tutorials/ocr-ing-nikes-new-rsvp-program/
I've modified few lines of code though and there is no error in that part (not sure if it's working because I haven't been able to successfully completely run it.)
When I run command 'python a.py'. This error is displayed:-
Traceback (most recent call last):
File "a.py", line 42, in <module>
otcnt = [c for c in cnt if cv2.contourArea(c) < 100]
TypeError: contour is not a numpy array, neither a scalar
a.py:-
#!/usr/bin/env python
import numpy as np
import cv2
import cv2.cv as cv
def do_ocr(img0):
pass
if __name__ == "__main__":
img0 = cv2.imread('nike-1.jpg')
if img0 == None:
import sys
sys.exit()
do_ocr(img0)
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
img2 = cv2.adaptiveThreshold(img1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)
size = np.size(img2)
skel = np.zeros(img2.shape,np.uint8)
ret,img2 = cv2.threshold(img2,127,255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
done = False
while( not done):
eroded = cv2.erode(img2,element)
temp = cv2.dilate(eroded,element)
temp = cv2.subtract(img2,temp)
skel = cv2.bitwise_or(skel,temp)
img2 = eroded.copy()
zeros = size - cv2.countNonZero(img2)
if zeros==size:
done = True
img3 = img2
img4 = cv2.copyMakeBorder(img3, 1, 1, 1, 1, cv2.BORDER_CONSTANT, value=0)
cv2.floodFill(img4, None, (0,0), 255)
img5 = cv2.erode(255-img4, np.ones((3,3), np.uint8), iterations=2)
cnt = cv2.findContours(img5, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
cnt = [c for c in cnt if cv2.contourArea(c) > 5000]
mask = np.zeros(img0.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)
dst = img2 & mask
cnt = cv2.findContours(dst.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
otcnt = [c for c in cnt if cv2.contourArea(c) < 100]
cv2.drawContours(dst, otcnt, -1, 0, -1)
api = tesseract.TessBaseAPI()
api.Init(".", "eng", tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "#ABCDEFGHIJKLMNOPQRSTUVWXYZ")
api.SetPageSegMode(tesseract.PSM_SINGLE_LINE)
image = cv.CreateImageHeader(dst.shape[:2], cv.IPL_DEPTH_8U, 1)
cv.SetData(image, dst.tostring(), dst.dtype.itemsize * dst.shape[1])
tesseract.SetCvImage(image, api)
print api.GetUTF8Text().string()
I'm very new to Python programming (and Python syntax) and I've to do this in Python anyway. I shall be very thankful to you if you can either post the complete correct version of it or finger point which line of code should be replaced with which one.
Thanks
p.s. My first question at stackoverflow so apologies if not following any convention.
This runtime error is caused by the fact that when you redefine cnt
on line 42 as
cnt = cv2.findContours(dst.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
you are setting it is the tuple of the two return values of cv2.findContours
. Look at your earlier call to the function on line 37 as a guide. All you need to do is change line 42 to
cnt = cv2.findContours(dst.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
Your next issue is that you haven't imported tesseract
.