基本思路
首先把模板中的数字单个分离开,再提取银行卡上的ROI,再将两者的二值图像进行模板匹配,确定出每一个数字,即实现了银行卡号识别,本质上就是模板匹配。
1、模板
- 转换成灰度图,二值化处理,用于轮廓检测。
- 找到所有数字的外轮廓,并画出轮廓。
- 对找到的轮廓排序,将排序集合,每个数字制成一个模板。
2、识别图片
识别银行卡号的话我们只需要识别中间的数字,其他的数字是干扰项
- 读取识别图像并转化为灰度图。
- 进行礼帽操作
- 利用Solb算子进行边缘检测
- Solb算子运算后的图像进行闭操作
- 轮廓检测,我们所需要的这四段数字它们的外接矩形的长宽或者比例是与途中其它元素不同的,我们通过这一特征在轮廓检测返回的队列中筛选出需要的部分,保存下来。
- 对每一组进行轮廓检测、排序(倒序),得到单个数字的轮廓,继续对其外接矩形切片。
- 得到的每个数字的外接矩形矩阵,与模板中每个数字进行匹配,得分最高对应正确数字。
3、代码部分
import cv2
import numpy as np
import imutils
from imutils import contours
# 初始化卷积核
myKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (33, 21))
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
# sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
def cv_show(name, imgs, time):
cv2.imshow(name, imgs)
cv2.waitKey(time)
cv2.destroyAllWindows()
temp = cv2.imread("D:/OpenCV_code/bank_card/temp.jpg")
cv_show("temp", temp, 1