python-OpenCV信用卡数字识别
Fu Xianjun. All Rights Reserved
文章目录
- 前言
- 一、数字识别是什么?
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 总结
前言
随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、数字识别是什么?
进行识别和匹配,将提取出来的数字与模板数字(需要自己创建)进行比较,这里采用两幅图片像素相减的方法,寻找出差值最小的图片即为最匹配的数字
二、使用步骤
1.引入库
代码如下:
import cv2
import numpy as np
2.读入数据
代码如下:
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=1boundingBoxes = [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
# 读取模板图片
template = cv2.imread('ocr_a_reference.png')
cv_show('template', template)
# 模板图片灰度化。这里的模板图片本身就是二值化的因此没有明显区别。
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
cv_show('templage_gray', template_gray)
# 二值化,转化为数字为白色,背景为黑色的图片。
template_binary = cv2.threshold(template_gray, 127, 255, cv2.THRESH_BINARY_INV)[1]
cv_show('template_binary', template_binary)
# 根据二值化的模板图,进行轮廓检测
cnts, hierarchy = cv2.findContours(template_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 画出每个数字的轮廓
template_rect = cv2.drawContours(template.copy(), cnts, -1, (0,0,255), 2)
cv_show('template_rect', template_rect)
# 对十个数字根据左上角的位置进行排序,这样数字按照从小到大的顺序排列出来。
cnts = sort_contours(cnts, method="left-to-right")[0]
number = {}
# 根据排列的结果,将每个数字截取出来。将每个数字图片所对应的数字对应起来。
# 这里要注意,对像素值进行取值时,数组的行对应的是图片的y轴,列对应的图片的x轴。
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
2.对信用卡信息进行处理,去除多余的背景信息。
cv_show(f"number1",number[3])
cardImg = cv2.imread('credit_card_03.png')
cardImg = cv2.resize(cardImg, \(300, int(float(300 / cardImg.shape[1]) * cardImg.shape[0])),\interpolation=cv2.INTER_AREA)cardImg_gray = cv2.cvtColor(cardImg, cv2.COLOR_BGR2GRAY)
cv_show('cardImg_gray', cardImg_gray)rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))cardImg_tophat = cv2.morphologyEx(cardImg_gray, cv2.MORPH_TOPHAT, rectKernel)
cv_show('cardImg_tophat', cardImg_tophat)
3.对信用卡上的数字进行选取,对于非卡号数字进行剔除。
sobelx = cv2.Sobel(cardImg_tophat, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
(minX, maxX) = (np.min(sobelx), np.max(sobelx))
sobelx = (255 * ((sobelx - minX) / (maxX - minX)))
sobelx = sobelx.astype('uint8')
cv_show('sobelx', sobelx)
cardImg_close = cv2.morphologyEx(sobelx, cv2.MORPH_CLOSE, rectKernel)
cv_show('cardImg_close', cardImg_close)
cardImg_binary = cv2.threshold(cardImg_close, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)[1]
cv_show('cardImg_binary', cardImg_binary)
cardImg_close = cv2.morphologyEx(cardImg_binary, cv2.MORPH_CLOSE, sqKernel)
cv_show('cardImg_close', cardImg_close)
cnts, hierarchy = cv2.findContours(cardImg_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cardImg_cnts = cv2.drawContours(cardImg.copy(), cnts, -1, (0,0,255), 2)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])
for (x, y, w, h) in locs:cv2.rectangle(cardImg_cnts, (x,y),(x+w,y+h),(0,0,255),3)
cv_show('cardImg_cnts', cardImg_cnts)
4.得到卡号区域后,对卡号进行数字划分。进行模板匹配,得到每个数字图像所对应的数字。
output = []
# 对每个4数字块进行处理
for (i, (x, y, w, h)) in enumerate(locs):group_output = []group = cardImg_gray[y-5:y + h + 5, x-5:x + w + 5]group = cv2.threshold(group, 0, 255, cv2.THRESH_OTSU|cv2.THRESH_BINARY)[1]cv_show('group', group)group_cnts, group_hierarchy = cv2.findContours(group, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)group_cnts = sort_contours(group_cnts, method="left-to-right")[0]# 分割每个数字for cnt in group_cnts:(nx,ny,nw,nh) = cv2.boundingRect(cnt)roi = group[ny:ny+nh, nx:nx+nw]roi = cv2.resize(roi, (57, 88))
# cv_show('roi', roi)score = []# 对每个数字进行模板匹配for (number_i, number_roi) in number.items():result = cv2.matchTemplate(roi, number_roi, cv2.TM_CCOEFF)score_ = cv2.minMaxLoc(result)[1]score.append(score_)group_output.append(str(np.argmax(score)))# 绘制每个数字cv2.rectangle(cardImg, (x - 5, y - 5),(x + w + 5, y + h + 5), (0, 0, 255), 1)cv2.putText(cardImg, "".join(group_output), (x, y - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)output.append(group_output)cv_show('cardImg', cardImg)
总结
以上就是今天要讲的内容,本文仅仅简单介绍了python中数字识别的使用,而python提供了大量能使我们快速便捷地处理数据的函数和方法。
python-OpenCV信用卡数字识别相关推荐
- 【项目实战】基于python+pycharm+OpenCV的信用卡数字识别
一.pycharm实现参数配置 直接运行程序会报错: usage: ocr_template_match.py [-h] -i IMAGE -t TEMPLATE ocr_template_match ...
- python信用卡客户_Python开发之基于模板匹配的信用卡数字识别功能
环境介绍 python 3.6 + OpenCV 3.4.1.15 原理介绍 首先,提取出模板中每一个数字的轮廓,再对信用卡图像进行处理,提取其中的数字部分,将该部分数字与模板进行匹配,即可得到结果. ...
- OpenCV实践小项目(一): 信用卡数字识别
1. 写在前面 今天整理一个OpenCV实践的小项目, 前几天整理了一篇OpenCV处理图像的知识笔记,后面,就通过一些小项目把这些知识运用到实践中去,一个是加深理解,另一个是融会贯通,连成整体,因为 ...
- Opencv项目实战-信用卡数字识别
Opencv项目实战:信用卡数字识别 导入库,定义展示函数 import cv2 import numpy as np from imutils import contours import myut ...
- (八)OpenCV入门,代码练习,详细注释【信用卡数字识别】【240行】【原创】
文章目录 信用卡图片 数字模板图片 一.数字模板图片处理步骤 1,读取模板图片 2,灰度处理图片 3,二值化处理图片 4,检测数字轮廓图片 二.识别信用卡图片处理步骤 1,图片信用卡 2,图片灰度处理 ...
- 信用卡数字识别—opencv
信用卡数字识别:就是识别信用卡的卡号,然后将卡号打印出来! 然后对应的数字模板如下图所示: 接下来我们就一步步的分析程序吧 1.导入相关的包 # 导入工具包 from imutils import c ...
- OpenCV车牌/数字识别
opencv 数字识别 附完整代码 Opencv的应用之车牌识别 用的支持向量机 使用opencv进行数字识别 对学习还是有点帮助的 Tensorflow 实现 MNIST 手 ...
- 2021-01-07 python opencv实现车牌识别 颜色定位
python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...
- Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割
注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...
- Python OpenCv 车牌检测识别(边缘检测、HSV色彩空间判断)
Python OpenCv 车牌检测识别 背景 车牌识别在交通.停车等方面有着广泛应用,在网上也有很多种基于OpenCV方案进行识别,本文是综合了两种比较流行的方案,首先是提取出疑似车牌区域的轮廓,然 ...
最新文章
- matlab using mtimes,同版本matlab、同一.m文件,为何一个顺利执行、另一个出错?
- 蓝桥杯-出现次数最多的整数(java)
- 4键电子手表说明书_家有破壁机的要收藏,教你4道早餐食谱,细腻香甜,比喝豆浆舒服...
- loadrunner利用虚拟IP测试
- 前端学习(1956)vue之电商管理系统电商系统之添加代码到仓库中
- Spring Cloud Alibaba —— Seata 分布式事务框架
- 多图详解边缘计算系统的组成及概念
- VxWorks程序一下载就停住了
- javascript 数组操作函数
- office 打开wps乱_wps打开word的乱码咋办?
- centos7 vi保存退出_怎么保存退出vi编辑 vi常用命令大全
- Intel出品开源图片标注工具CVAT在Ubuntu18.04上部署
- 33.Jump Game(跳步游戏)
- 今天是冰桶算法大揭秘!!
- FreeSurfer数据质量指标:欧拉数Euler Number
- 被拿走的雨伞——我想到的
- 【蓝桥备赛冲刺】2022年第十三届省赛模拟题题解C/C++
- 微信小程序学习笔记(1)
- 鼠标hover出现遮罩
- RTX之——时间管理