© Fu Xianjun. All Rights Reserved.
一.读取
import cv2
import numpy as np
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(cnt) for cnt in cnts]
(cnts,boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),\
key = lambda b: b[1][i],\
reverse= reverse))
return cnts, boundingBoxes
def cv_show(name,img):#定义一个函数,显示图片
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
template = cv2.imread("ocr_a_reference.png")#读模板
# cv_show("template",template)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
#色彩空间转换,转换成灰度图
# cv_show("template_gray",template_gray)
ret, template_binary = cv2.threshold(template_gray, 127,255, 1)
#二值化
cv_show("template_binary",template_binary)
二.选取
cnts, he = cv2.findContours(template_binary, cv2.RETR_EXTERNAL,\
cv2.CHAIN_APPROX_SIMPLE)
#查找外轮廓
template_rect = cv2.drawContours(template, cnts, -1,(0,0,255),2)
#绘制轮廓
# cv_show("template_rect",template_rect)
cnts = sort_contours(cnts)[0]
number = {}
for (i,cnt) in enumerate(cnts):
(x,y,w,h) = cv2.boundingRect(cnt)
roi = template_binary[y:y+h, x:x+w]
roi = cv2.resize(roi, (57,88))
number[i] = roi
cv_show(f"number1",number[3])