该案例主要巩固所学opencv基础知识,有轮廓检测,形态学知识以及模板匹配。以及python基础知识和对矩阵的运算
该案例分为两部分,第一部分使用鼠标选取数字部分,并保存。


```python
import cv2
import numpy as np
cv2.namedWindow('cardNum')
card = cv2.imread('./img/images/credit_card_01.png')
model = cv2.imread('./img/images/ocr_a_reference.png')
card2 = card.copy()
#鼠标截取范围
StartX = 0
StartY = 0
w = 0
h = 0
flag_c = 0
flag_rect = Falsedef mouse(event,x,y,flags,userdata):global StartX, StartY,w,h,flag_rect,cardif event == cv2.EVENT_LBUTTONDOWN:flag_rect = TrueStartX = xStartY = y#print("left down")elif event == cv2.EVENT_LBUTTONUP:flag_rect = Falsecv2.rectangle(card,(StartX,StartY), (x,y), (0,255,0), 2)w = abs(StartX-x)h = abs(StartY-y) print(StartX,StartY,w,h)elif event == cv2.EVENT_MOUSEMOVE:if flag_rect == True:card = card2.copy()cv2.rectangle(card,(StartX,StartY),(x,y),(0,255,0),2)#print("move")cv2.setMouseCallback('cardNum',mouse)#ROI = card[rect[0]:rect[0]+rect[2],rect[1]:rect[1]+rect[3]]
print(StartX,StartY,w,h)while True:cv2.imshow('cardNum',card)if flag_c ==1:ROI = card[StartY:StartY+h-1,StartX:StartX+w-1]cv2.imwrite('./img/images/roi.png',ROI)#cv2.imshow('ROI2',card_Gray4)#cv2.imshow('model',model)
#    cv2.imshow('ROI',ROI)k =cv2.waitKey(100)if k== 27:breakif k == ord('o'):flag_c = 1
cv2.destroyAllWindows()


第二部分为图像处理和识别部分
import cv2import numpy as npka = cv2.imread('./img/images/credit_card_02.png')
ka2 = ka.copy()
#card = ka2[189:233,42:541]
card = cv2.imread('./img/images/roi2.png')
model = cv2.imread('./img/images/ocr_a_reference.png')
#更改大小-和template大小相似
Gray2 = cv2.resize(card,(2*card.shape[1],2*card.shape[0]))
model = cv2.resize(model,(int(0.7*model.shape[1]),int(0.7*model.shape[0])))#数字排序
def sequence(image):contours, _ = cv2.findContours(image,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#cv2.drawContours(Gray2,contours,-1,(0,0,255),2)n = len(contours)#创建n*4的矩阵RectBoxes0 = np.ones((n,4),dtype = int)for i in range(n):RectBoxes0[i] = cv2.boundingRect(contours[i])RectBoxes = np.ones((n,4),dtype = int)for i in range(n):ftemp = 0for j in range(n):if RectBoxes0[i][0] > RectBoxes0[j][0]:ftemp = ftemp+1RectBoxes[ftemp] = RectBoxes0[i]ImgBoxs = [[] for i in range(n)]for i in range(n):x,y,w,h = RectBoxes[i]ROI = image[y:y+h,x:x+w]ROI = cv2.resize(ROI,(50,80))_,ROI = cv2.threshold(ROI,200,255,cv2.THRESH_BINARY)ImgBoxs[i] = ROIreturn RectBoxes,ImgBoxs#灰度化
card_Gray = cv2.cvtColor(Gray2,cv2.COLOR_BGR2GRAY)
model_Gray = cv2.cvtColor(model,cv2.COLOR_BGR2GRAY)
#自适应二值化  高斯确定阈值法 21:自适应确定阈值的邻域大小   3:平均值减去的数
thresh = cv2.adaptiveThreshold(card_Gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,21,3)
_,thresh_model = cv2.threshold(model_Gray,200,255,cv2.THRESH_BINARY)
thresh_model = cv2.bitwise_not(thresh_model)
#逻辑非运算-黑白转换
thresh = cv2.bitwise_not(thresh)
#发现轮廓
contours,_ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#如果轮廓面积小于60变为黑色
for i in range(len(contours)):if cv2.contourArea(contours[i]) < 60:threshs = cv2.drawContours(thresh,contours,i,(0,0,0),-1)
#黑帽运算--
kernel = np.ones((15,15),dtype=np.uint8)
blackhat = cv2.morphologyEx(threshs,cv2.MORPH_BLACKHAT,kernel)
#腐蚀运算
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
erodes = cv2.erode(blackhat,kernel2,iterations=1)
#closes = cv2.morphologyEx(erodes,cv2.MORPH_CLOSE,kernel2,iterations=3)
contours,_ = cv2.findContours(erodes,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#根据图像面积和长宽比进行选取
for i in range(len(contours)):x,y,w,h = cv2.boundingRect(contours[i])aspect_ratio = float(w)/hA = float(w)*hif A<700 or A>4000:erodes = cv2.drawContours(erodes,contours,i,(0,0,0),-1)elif aspect_ratio>7.0 or aspect_ratio <0.5:erodes = cv2.drawContours(erodes,contours,i,(0,0,0),-1)
#膨胀后,model和value数字宽度合适
dilation = cv2.dilate(erodes,kernel2,iterations=1)
rectBox,ROIbox = sequence(dilation)
ModelBox,ModelROIbox = sequence(thresh_model)
#模板匹配score = np.zeros(len(ModelROIbox),dtype=int)
for i in range(len(ROIbox)):for j in range(len(ModelROIbox)):score[j] = cv2.matchTemplate(ROIbox[i],ModelROIbox[j],cv2.TM_SQDIFF)min_val,max_val,min_indx,max_indx = cv2.minMaxLoc(score)string=str(min_indx[1])cv2.putText(ka,string,(90+i*25,195),2,1,(0,0,255))#print(rect)
cv2.imshow('dilation',ka)
#cv2.imshow('r',r)
cv2.waitKey()![在这里插入图片描述](https://img-blog.csdnimg.cn/249bfbcc1fdc44e9a647d71ef898c848.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54Ok57qi6Jav6YWN6bG_6bG85Lid,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center)

案例3-使用python实现基于opencv的银行卡号识别相关推荐

  1. 案例-使用python实现基于opencv的车辆识别

    写在开头,接触opencv也有很长一段时间了,中间还接触了halcon.但都是基于C++实现,发现如果有什么idea,还是使用python可以快速实现.基于C++版本的后期会有更新. 首先,这个案例是 ...

  2. Python 毕业设计 - 基于 opencv 的人脸识别上课考勤系统,附源码

    一.简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的. 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片.交互界 ...

  3. 案例-使用python实现基于opencv的形状识别

    该案例主要涉及到不同形状的图形.根据获得轮廓,计算边数.来判断属于什么形状,并将之输出在图片上.具体代码和结果如下: import cv2 from urllib3 import connection ...

  4. Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别

    一.案例概述 本案例需要一定的Python编程基础并掌握OpenCV基本使用. 时间仓促:初略编写文档 效果如下: 开发环境: 操作系统:Windows 10 开发工具:PyCharm 2019.2版 ...

  5. Python基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  6. Python 基于 opencv 的车牌识别系统, 可以准确识别车牌号

    大家好,我是程序员徐师兄,6 年大厂程序员经验,点击关注我 简介 毕业设计基于Opencv的车牌识别系统 车牌搜索识别找出某个车牌号 对比识别车牌系统 车牌数据库认证系统 车牌图文搜索系统 车牌数据库 ...

  7. 基于OpenCV实现人脸识别--Python

    目录 前言 第一章 OpenCV介绍 第二章 功能描述 2.1 对已有的数据进行检测 2.2 陌生人检测并发出警告 2.3 保存陌生人的视频 2.4 输入图片进行检测 2.5 现场录用信息 第三章 功 ...

  8. 基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

  9. 树莓派 --- 基于OpenCV实现人脸识别

    目录 参考博客 调百度人脸识别的API也能达到目的,我这里是基于OpenCV进行人脸识别 OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉 ...

  10. 基于OpenCV的车牌识别的设计与实现

    随着大数据和互联网技术的快速发展,利用人工智能技术实现车牌信息的自动识别推荐成为研究的热门话题.通过对基于OpenCV的车牌识别系统的网站功能需要进行讨论研究,这种跨平台计算机视觉和机器学习非常适用于 ...

最新文章

  1. UI培训教程分享:APP启动页UI界面设计
  2. Python是世界上最好的语言,你不服不行!(附资料)
  3. 我的世界java测试版下载_我的世界中国版PC不删档测试版_网易我的世界JAVA版测试版单机游戏下载...
  4. 一篇文章全方位了解:static main final
  5. 15--0~n-1中缺失的数字
  6. Python响应Ctrl键+鼠标滚轮操作动态调整文本框的字号
  7. 计算机网络自顶向下-链路层
  8. eclipse打断点调试进入到class文件中,不显示变量值的解决办法汇总
  9. CCNA认证考试介绍
  10. python删除停用词_删除停用词
  11. TCP 和 UDP 区别及使用场景(详细)
  12. win7软件图标异常解决
  13. 微信从原版到现在所有界面图片_微信6年来首次更换启动界面地球图片:来感受一下...
  14. EXCEL如何设置打印区域
  15. 《Java语言程序设计与数据结构(基础篇)》第11版第四章复习题答案
  16. 怎么做好一件复杂的事情 No.201
  17. 【论文笔记】MLFF-GAN:A Multilevel Feature Fusion WithGAN for Spatiotemporal Remote Sensing Images
  18. PostgreSQL 查表、所属schema、字段、字段类型、注释等信息
  19. 打包/发包工具-需求分析一
  20. android studio 导入项目失败,Android Studio导入项目报错,新建项目失败

热门文章

  1. 财务软件虚拟服务器,财务服务器软件
  2. x550网卡linux驱动,Intel英特尔X520/X540/X550/82599系列万兆网卡驱动5.10.2版For Linux(2021年2月1日发布)...
  3. 软件测试的测试代码,软件测试(示例代码)
  4. 用matlab绘制函数图像
  5. win10跳过计算机密码,Win10怎么取消开机密码?Win10如何跳过开机密码?
  6. 虚拟机是ubuntu,windows映射盘符方式访问虚拟机
  7. 多个PDF合并后页面大小不一
  8. 【渝粤题库】国家开放大学2021春2018货币银行学题目
  9. 为什么原理图中元器件下面有红色波浪线?
  10. oracle awr报告提取,Oracle AWR报告提取方法