2016-09-28 3 views
0

Ich habe das Script aktualisieren, aber einen Fehler kann ich nicht beheben. Hier mein Skript Version:Skript Fehler von "Einfache Ziffernerkennung OCR in OpenCV-Python"

import sys 
import numpy as np 
import cv2 

im = cv2.imread('test001.png') 
res = cv2.resize(im,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) 
im3 = res.copy() 

gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY) 
blur = cv2.GaussianBlur(gray,(5,5),0) 
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2) 

#################  Now finding Contours   ################### 

_,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 

samples = np.empty((0,100)) 
responses = [] 
keys = [i for i in range(48,58)] 

for cnt in contours: 
    if (cv2.contourArea(cnt)>50) and (cv2.contourArea(cnt)<900): 

     [x,y,w,h] = cv2.boundingRect(cnt) 
     if ((h>0) and (h<35)) and ((w>0) and (w<35)): 
      cv2.rectangle(res,(x,y),(x+w,y+h),(0,0,255),1) 
      roi = thresh[y:y+h,x:x+w] 
      roismall = cv2.resize(roi,(30,30)) 
      cv2.imshow('norm',res) 
      key = cv2.waitKey(0) % 256 
      print ("+") 
      print (key) 
      print ("+") 

      if key == 27: # (escape to quit) 
       sys.exit() 
      elif key in keys: 
       print ("-") 
       print (key) 
       print ("-") 
       responses.append(int(key)) 
       print (len(roismall)) 
       sample = roismall.reshape((1,100)) 
       samples = np.append(samples,sample,0) 

responses = np.array(responses,np.float32) 
responses = responses.reshape((responses.size,1)) 
print ("training complete") 

np.savetxt('generalsamples.data',samples) 
np.savetxt('generalresponses.data',responses) 

Wenn ich den Code ausführen bekomme ich diesen Fehler:

Traceback (most recent call last): File "file001.py", line 45, in sample = roismall.reshape((1,100)) ValueError: total size of new array must be unchanged

Der letzte print "print (len (roismall))" einen Wert von 30

haben

Grüßen Thomas

Antwort

0

dieser Fehler war Hausgemachte:

sample = roismall.reshape((1,100)) 

wird entsprechend dieser Zeile:

roismall = cv2.resize(roi,(30,30)) 

Die 30 x 30 = 900 den richtigen Wert ist oder 10,10 = 100. ich es ändern zurück zu:

roismall = cv2.resize(roi,(10,10)) 

Hier die complett Skript:

import sys 

import numpy as np 
import cv2 

im = cv2.imread('test001.png') 
res = cv2.resize(im,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) 
im3 = res.copy() 

gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY) 
blur = cv2.GaussianBlur(gray,(5,5),0) 
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2) 

#################  Now finding Contours   ################### 

_,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 

samples = np.empty((0,100)) 
sample = np.empty((0,100)) 
responses = [] 
keys = [i for i in range(48,58)] 

for cnt in contours: 
    if (cv2.contourArea(cnt)>10) and (cv2.contourArea(cnt)<900): 

     [x,y,w,h] = cv2.boundingRect(cnt) 
     if ((h>15) and (h<30)) and ((w>8) and (w<30)): 
      cv2.rectangle(res,(x,y),(x+w,y+h),(0,0,255),1) 
      roi = thresh[y:y+h,x:x+w] 
      roismall = cv2.resize(roi,(10,10)) 
      cv2.imshow('roi',roismall) 
      cv2.imshow('norm',res) 
      key = cv2.waitKey(0) % 256 
      if key == 27: # (escape to quit) 
       sys.exit() 
      elif key in keys: 
       responses.append(int(key)) 
       sample = roismall.reshape((1,100)) 
       samples = np.append(samples,sample) 

responses = np.array(responses,np.float32) 
responses = responses.reshape((responses.size,1)) 
print ("training complete") 

np.savetxt('generalsamples.data',samples) 
np.savetxt('generalresponses.data',responses) 

Bezug auf Thomas