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信用卡数字识别相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 信用卡数字识别—opencv

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

  7. OpenCV车牌/数字识别

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

  8. 2021-01-07 python opencv实现车牌识别 颜色定位

    python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...

  9. Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割

    注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...

  10. Python OpenCv 车牌检测识别(边缘检测、HSV色彩空间判断)

    Python OpenCv 车牌检测识别 背景 车牌识别在交通.停车等方面有着广泛应用,在网上也有很多种基于OpenCV方案进行识别,本文是综合了两种比较流行的方案,首先是提取出疑似车牌区域的轮廓,然 ...

最新文章

  1. matlab using mtimes,同版本matlab、同一.m文件,为何一个顺利执行、另一个出错?
  2. 蓝桥杯-出现次数最多的整数(java)
  3. 4键电子手表说明书_家有破壁机的要收藏,教你4道早餐食谱,细腻香甜,比喝豆浆舒服...
  4. loadrunner利用虚拟IP测试
  5. 前端学习(1956)vue之电商管理系统电商系统之添加代码到仓库中
  6. Spring Cloud Alibaba —— Seata 分布式事务框架
  7. 多图详解边缘计算系统的组成及概念
  8. VxWorks程序一下载就停住了
  9. javascript 数组操作函数
  10. office 打开wps乱_wps打开word的乱码咋办?
  11. centos7 vi保存退出_怎么保存退出vi编辑 vi常用命令大全
  12. Intel出品开源图片标注工具CVAT在Ubuntu18.04上部署
  13. 33.Jump Game(跳步游戏)
  14. 今天是冰桶算法大揭秘!!
  15. FreeSurfer数据质量指标:欧拉数Euler Number
  16. 被拿走的雨伞——我想到的
  17. 【蓝桥备赛冲刺】2022年第十三届省赛模拟题题解C/C++
  18. 微信小程序学习笔记(1)
  19. 鼠标hover出现遮罩
  20. RTX之——时间管理

热门文章

  1. InnerHTML、InnerText、outerHTML的用法与区别
  2. ifconfig结果详解
  3. Java SE菜鸟之泛型
  4. 紫微斗数:命主和身主
  5. 学徒浅析Android——Android7.0(N)对于自定义证书和非CA机构证书的适配校验
  6. scp传输文件时如何后台运行?
  7. Vuex前端saas人力资源中台管理项目第五天 权限管理和图表设计
  8. Python之print打印
  9. Python:实现quantum entanglement量子纠缠技术算法(附完整源码)
  10. svn初步安装使用(详细教程图文操作)