OpenCV TypeError: contour n'est pas un tableau numpy, ni un scalaire
Je suis en train d'utiliser OpenCV pour extraire les balises de Nike images. Ceci est un tutoriel code tiré de:
http://opencv-code.com/tutorials/ocr-ing-nikes-new-rsvp-program/
J'ai modifié quelques lignes de code et si il n'y a pas d'erreur dans la partie (je ne sais pas si ça fonctionne car je n'ai pas réussi à complètement l'exécuter.)
Quand je lance la commande " python un.py'. Cette erreur est affiché:-
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
un.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()
Je suis très nouveau à la programmation Python (et la syntaxe de Python) et je n'ai qu'à le faire en Python de toute façon. Je vous serais très reconnaissant si vous pouvez soit envoyer le complet version correcte de l'informatique ou du doigt point de la ligne de code qui doit être remplacé par qui.
Grâce
p.s. Ma première question sur stackoverflow alors, toutes mes excuses si pas à la suite de toute convention.
OriginalL'auteur Omar Tariq | 2013-07-13
Vous devez vous connecter pour publier un commentaire.
Cette erreur d'exécution est provoquée par le fait que lorsque vous redéfinissez
cnt
sur la ligne 42 en tant quevous êtes, il est le n-uplet des deux valeurs de retour de
cv2.findContours
. Regardez votre appel à la fonction sur la ligne 37 comme un guide. Tout ce que vous devez faire est de changer la ligne 42 àVotre prochaine question, c'est que vous n'avez pas importé
tesseract
.OriginalL'auteur Sajjan Singh