import cv2 import numpy as np import warnings warnings.filterwarnings('ignore') def sort_contours(cnts, method="left-to-right"): reverse = False i = 0 if method == "right-to-left" or method == "bottom-to-top": reverse = True if method == "top-to-bottom" or method == "bottom-to-top": i = 1 boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes), key=lambda b: b[1][i], reverse=reverse)) return cnts, boundingBoxes def resize(image, width=None, height=None, inter=cv2.INTER_AREA): dim = None (h, w) = image.shape[:2] if width is None and height is None: return image if width is None: r = height / float(h) dim = (int(w * r), height) else: r = width / float(w) dim = (width, int(h * r)) resized = cv2.resize(image, dim, interpolation=inter) return resized img=cv2.imread('number.png') ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) _,ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV) refCnts,_=cv2.findContours(ref,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # cv2.drawContours(img,refCnts,-1,(0,0,255),3) refCnts = sort_contours(refCnts, method="left-to-right")[0]#排序,从左到右,从上到下 digits={} for (i,c) in enumerate(refCnts): (x,y,w,h)=cv2.boundingRect(c) # cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) roi=ref[y:y+h,x:x+w] roi=cv2.resize(roi,(57,88)) digits[i]=roi # print(len(digits)) rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3)) sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) img=cv2.imread('testimage.png') img=resize(img,width=300) gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) gradX=cv2.Sobel(gray,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1) gradX=np.absolute(gradX) minVal,maxVAL=np.min(gradX),np.max(gradX) gradX=255*((gradX-minVal)/(maxVAL-minVal)) gradX=gradX.astype(np.uint8) gradX=cv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKernel) _,thres=cv2.threshold(gradX,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #只要灰度大于0的都设为255 thres=cv2.morphologyEx(thres,cv2.MORPH_CLOSE,sqKernel) threshCnts,_=cv2.findContours(thres,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # cv2.drawContours(img,threshCnts,-1,(0,255,0),3) cnts=threshCnts locs=[] for i,c in enumerate(cnts): x,y,w,h=cv2.boundingRect(c) if h>w: h,w=w,h acr=w/h if 2.5