信用卡数字识别

刚刚学了信用卡数字识别的案例,在此记录一下。。用的是模板匹配的方法

首先是对模板的处理,这是所用的模板,主要的任务是将这是十个数字进行分割标号,即第一个位置标识为0,第二个位置标识为2…
先对该模板图片进行轮廓检测,然后画出每一个数字的外接矩形,再对这十个外接矩形进行排序,得到相应的字典,每个位置对应相应的数字。
信用卡数字识别_第1张图片

refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,refCnts,-1,(0,0,255),3) ##传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
cv_show('img',img)
print (np.array(refCnts).shape)
refCnts = myutils.sort_contours(refCnts, method="left-to-right")[0] #排序,从左到右,从上到下
digits = {}
# 遍历每一个轮廓
for (i, c) in enumerate(refCnts):   #枚举
	# 计算外接矩形并且resize成合适大小
	(x, y, w, h) = cv2.boundingRect(c)
	roi = ref[y:y + h, x:x + w]
	roi = cv2.resize(roi, (57, 88))
	# 每一个数字对应每一个模板
	digits[i] = roi

然后再对识别的图像进行处理
可以用一系列的图片变换操作来得到信用卡上含有卡号的区域。这里主要用的方法是礼帽操作和开闭运算,然后再进行区域的筛选,可以用横纵比的方法,选出我们感兴趣的区域。

	# 选择合适的区域,根据实际任务来,这里的基本都是四个数字一组
	if ar > 2.5 and ar < 4.0:

		if (w > 40 and w < 55) and (h > 10 and h < 20):
			#符合的留下来
			locs.append((x, y, w, h))

信用卡数字识别_第2张图片
得到卡号的区域后,我们可以获得四组数据,再将每一组数据进行分割提取,来得到每个数字。
在这里插入图片描述
最后进行模板匹配,计算匹配得分,返回分数最高的数字

		# 在模板中计算每一个得分
		for (digit, digitROI) in digits.items():
			# 模板匹配
			result = cv2.matchTemplate(roi, digitROI,
				cv2.TM_CCOEFF)
			(_, score, _, _) = cv2.minMaxLoc(result)
			scores.append(score)

		# 得到最合适的数字
		groupOutput.append(str(np.argmax(scores)))

信用卡数字识别_第3张图片

你可能感兴趣的:(信用卡数字识别)