OpenCV TypeError: contour is not a numpy array, neither a scalar

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

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.

回答1:

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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!