模板图

银行卡图

# 导入工具包
from imutils import contours
import numpy as np
import argparse
import cv2
# 指定信用卡类型
FIRST_NUMBER = {"3": "American Express","4": "Visa","5": "MasterCard","6": "Discover Card"
}
# 绘图展示函数
def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)
# cv2.destroyAllWindows()
# 读取一个模板图像
img = cv2.imread("ocr_a_reference.png")
cv_show('template',img)
# 灰度图
ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv_show('template_gray',ref)
# 二值图像
ref = cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV)[1]
cv_show('template_bi',ref)


# 计算轮廓
# cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),cv2.RETR_EXTERNAL只检测外轮廓,cv2.CHAIN_APPROX_SIMPLE只保留终点坐标
# 返回的list中每个元素都是图像中的一个轮廓ref_,refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(img,refCnts,-1,(0,0,255),3)  # 轮廓在二值图上得到, 画要画在原图上
cv_show('template_Contours',img)
print (np.array(refCnts).shape)


# 对轮廓进行排序函数
def sort_contours(cnts, method="left-to-right"):reverse = Falsei = 0if method == "right-to-left" or method == "bottom-to-top":reverse = Trueif method == "top-to-bottom" or method == "bottom-to-top":i = 1# 计算外接矩形 boundingBoxes是一个元组boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w# sorted排序(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))return cnts, boundingBoxes  # 轮廓和boundingBoxess
# 图像处理函数
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 imageif 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
refCnts = sort_contours(refCnts, method="template_Contours")[0] #排序,从左到右,从上到下
digits = {}
# 遍历每一个轮廓
for (i, c) in enumerate(refCnts):   # c是每个轮廓的终点坐标
# 计算外接矩形并且resize成合适大小(x, y, w, h) = cv2.boundingRect(c)roi = ref[y:y + h, x:x + w]      # 每个roi对应一个数字 roi = cv2.resize(roi, (57, 88))  # 太小,调大点digits[i] = roi # 每一个数字对应每一个模板# 【模板处理流程: 轮廓检测,外接矩形,抠出模板,让模板对应每个数值】# 【输入图像处理】
# 形态学操作,礼帽+闭操作可以突出明亮区域,但并不是非得礼帽+闭操作
# 初始化卷积核,根据实际任务指定大小,不一定非要3x3
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
#读取输入图像,预处理
image = cv2.imread("credit_card_01.png")
cv_show('Input_img',image)
image = resize(image, width=300)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv_show('Input_gray',gray)


#礼帽操作,突出更明亮的区域
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)
cv_show('Input_tophat',tophat)
# x方向的Sobel算子,实验表明,加y的效果的并不好
gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0, #ksize=-1相当于用3*3的ksize=-1)gradX = np.absolute(gradX)    # absolute: 计算绝对值
(minVal, maxVal) = (np.min(gradX), np.max(gradX))
gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))
gradX = gradX.astype("uint8")print (np.array(gradX).shape)
cv_show('Input_Sobel_gradX',gradX)


# 通过闭操作(先膨胀,再腐蚀)将数字连在一起.  将本是4个数字的4个框膨胀成1个框,就腐蚀不掉了
gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)
cv_show('Input_CLOSE_gradX',gradX)# THRESH_OTSU会自动寻找合适的阈值,适合双峰,需把阈值参数设置为0
thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv_show('Input_thresh',thresh)# 再来一个闭操作
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel) # 填补空洞
cv_show('Input_thresh_CLOSE',thresh)# 计算轮廓
thre_,threshCnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = threshCnts
cur_img = image.copy()
cv2.drawContours(cur_img,cnts,-1,(0,0,255),3)
cv_show('Input_Contours',cur_img)
locs = []




# 遍历轮廓
for (i, c) in enumerate(cnts):
# 计算矩形(x, y, w, h) = cv2.boundingRect(c)ar = w / float(h)
# 选择合适的区域,根据实际任务来,这里的基本都是四个数字一组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))
# 将符合的轮廓从左到右排序
locs = sorted(locs, key=lambda x:x[0])
output = []
# 遍历每一个轮廓中的数字
for (i, (gX, gY, gW, gH)) in enumerate(locs):   # 遍历每一组大轮廓(包含4个数字)
# initialize the list of group digitsgroupOutput = []
# 根据坐标提取每一个组(4个值)group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]  # 往外扩一点
# cv_show('group',group)
# 1.预处理
# 二值化的groupgroup = cv2.threshold(group,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]group_name = 'Input_group_' + str(i)cv_show(group_name,group)cv2.imwrite('./credit_card_01/' + group_name + '.jpg',group)
# 计算每一组的轮廓 这样就分成4个小轮廓了dig_,digitCnts,hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 排序digitCnts = contours.sort_contours(digitCnts,method="left-to-right")[0]# 2.计算并匹配每一组中的每一个数值for c in digitCnts:       # c表示每个小轮廓的终点坐标z=0
# 找到当前数值的轮廓,resize成合适的的大小(x, y, w, h) = cv2.boundingRect(c)    # 外接矩形roi = group[y:y + h, x:x + w]      # 在原图中取出小轮廓覆盖区域,即数字roi = cv2.resize(roi, (57, 88))roi_name = 'roi_'+str(z)# cv_show(roi_name,roi)# 计算匹配得分: 0得分多少,1得分多少...scores = []  # 单次循环中,scores存的是一个数值 匹配 10个模板数值的最大得分
# 在模板中计算每一个得分#digits的digit正好是数值0,1,...,9;digitROI是每个数值的特征表示for (digit, digitROI) in digits.items():# 进行模板匹配, res是结果矩阵result = cv2.matchTemplate(roi, digitROI,cv2.TM_CCOEFF)   # 此时roi是5 digitROI是0 依次是1,2.. 匹配10次,看模板最高得分多少(_, score, _, _) = cv2.minMaxLoc(result)  # score是最大值scores.append(score) # 10个最大值# 得到最合适的数字groupOutput.append(str(np.argmax(scores)))    # 取最大值z = z+1# 画出来cv2.rectangle(image, (gX - 5, gY - 5),(gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)# putText参数:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细cv2.putText(image, " ".join(groupOutput), (gX, gY - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)# 得到结果output.extend(groupOutput)




# 打印结果
print("Credit Card Type: {}".format(FIRST_NUMBER[output[0]]))
print("Credit Card #: {}".format("".join(output)))
cv2.imshow("Output_image", image)
cv2.waitKey(0)


OpenCV-信用卡数字识别-03相关推荐

  1. OpenCV实践小项目(一): 信用卡数字识别

    1. 写在前面 今天整理一个OpenCV实践的小项目, 前几天整理了一篇OpenCV处理图像的知识笔记,后面,就通过一些小项目把这些知识运用到实践中去,一个是加深理解,另一个是融会贯通,连成整体,因为 ...

  2. Opencv项目实战-信用卡数字识别

    Opencv项目实战:信用卡数字识别 导入库,定义展示函数 import cv2 import numpy as np from imutils import contours import myut ...

  3. (八)OpenCV入门,代码练习,详细注释【信用卡数字识别】【240行】【原创】

    文章目录 信用卡图片 数字模板图片 一.数字模板图片处理步骤 1,读取模板图片 2,灰度处理图片 3,二值化处理图片 4,检测数字轮廓图片 二.识别信用卡图片处理步骤 1,图片信用卡 2,图片灰度处理 ...

  4. 信用卡数字识别—opencv

    信用卡数字识别:就是识别信用卡的卡号,然后将卡号打印出来! 然后对应的数字模板如下图所示: 接下来我们就一步步的分析程序吧 1.导入相关的包 # 导入工具包 from imutils import c ...

  5. 【项目实战】基于python+pycharm+OpenCV的信用卡数字识别

    一.pycharm实现参数配置 直接运行程序会报错: usage: ocr_template_match.py [-h] -i IMAGE -t TEMPLATE ocr_template_match ...

  6. python信用卡客户_Python开发之基于模板匹配的信用卡数字识别功能

    环境介绍 python 3.6 + OpenCV 3.4.1.15 原理介绍 首先,提取出模板中每一个数字的轮廓,再对信用卡图像进行处理,提取其中的数字部分,将该部分数字与模板进行匹配,即可得到结果. ...

  7. OpenCV车牌/数字识别

    opencv 数字识别 附完整代码 Opencv的应用之车牌识别       用的支持向量机 使用opencv进行数字识别       对学习还是有点帮助的 Tensorflow 实现 MNIST 手 ...

  8. opencv-实战-信用卡数字识别

    信用卡-数字识别 功能说明 简要步骤 先得到轮廓的外接矩形 然后对模板和图像进行轮廓检测得到外轮廓 例如先对4进行外接轮廓检测后再一一和模板里面的一一匹配 处理 先读入图像转入灰度图 对两个图像先re ...

  9. 信用卡数字识别OpenCV实现(含代码)【DataWhale项目】

    参考课程:Opencv计算机视觉实战(Python版) 基本材料准备 一张仅含数字的图像作为模板. 一张银行卡的图像作为检测样本. 代码编写或者阅读的习惯 常打断点 勤展示数组的shape等,以及数组 ...

  10. 一文详解opencv摄像头数字识别

    OpenCV数字识别 一.数字识别的两种方式 1.1 轮廓提取法 1.2 行列扫描法 二.提取图像中的ROI区域 2.1 读取摄像头图像 2.2 对图像进行二值化处理 2.3 形态学处理 2.4 设置 ...

最新文章

  1. python绘制月亮_Python函数
  2. 13位PM告诉你:「陌生人社交」如何逃离互加微信“魔咒”?
  3. Ubuntu_Win10双系统互换注意事项以及蓝屏解决方案
  4. 不建议在Docker中部署数据库
  5. ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案
  6. Android官方开发文档Training系列课程中文版:分享简单数据之添加简单的分享行为
  7. vue+nodejs 将canvas发布到dlna投屏服务
  8. Maven: git-commit-id-plugin插件
  9. Android4.4 多媒体开发(五)----OpenMax简介
  10. 理解x86架构的捷径
  11. html中播放的语法是什么,css语法是什么?
  12. HTTPS 证书生成原理和部署细节
  13. appscan无法连接到服务器_闪烁之光无法连接服务器怎么办 解决方案一览
  14. Power Analysis估算样本容量
  15. uni-app 中使用外部第三方字体(非字体图标)
  16. 【MQTT学习】lesson8. :Retained 消息和 LWT
  17. 复选框的全选、全不选、和获取选中的值;
  18. 阻塞非阻塞使用,initial assign always区别
  19. android音频口通信——2FSK信号调制
  20. 陪伴型机器人主场到来:热衷跳舞的波士顿“狗”开始搬砖、Sophia量产恐怖谷效应显现、与人类互动的机器狗来了 | 硅谷速递...

热门文章

  1. php防止报错,php报错:Cannot redeclare class 提示的解决方法
  2. 企业 MySQL 优化实施方案
  3. 网站运维技术与实践之服务器监测常用命令
  4. controller怎么调用controller_SpringMVC五大核心组件及调用过程
  5. oc语言和c语言,C语言及OC语言初期学习心得
  6. java void eat_java匿名内部类
  7. assert文件夹 设置android_android使用build.xml配置assert文件中不压缩的类型文件
  8. 位置传感器matlab,永磁同步电机无位置传感器控制matlab仿真【续贴二】
  9. go mysql 数据 json,golang查询数据返回json
  10. CentOS 安装宋体字体