这个非常麻烦,麻烦到我真的不想做

但是我也没有办法的呢

好了开始这个图片数字识别

  • 例如把下面的信用卡上的数字识别出来

  • 因为这次的代码分段比较多,所以把重复操作的过程打包成函数提前运行了

import cv2
import numpy as np
def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()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(c) for c 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_gary = cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
ret,template_binary = cv2.threshold(template_gary,0,255,1)
cv_show("template_binary",template_binary)

  • 使用上面的函数把图片框选出来之后一个一个切分出来,并进行排序赋值
cnts,h = 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)[0]
number = {}
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]= roicv_show("roi",roi)
  • 接下来对原图进行处理,先二值化然后进行礼帽处理总之都是为了去除噪点
cardImg = cv2.imread("credit_card_01.png")
h,w = cardImg.shape[:2]
cardImg = cv2.resize(cardImg,(300,int(float(300/w)*h)))
cardImg_gary = cv2.cvtColor(cardImg,cv2.COLOR_BGR2GRAY)
cv_show("cardImg_gary",cardImg_gary)
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
cardImg_tophat = cv2.morphologyEx(cardImg_gary,cv2.MORPH_TOPHAT,rectKernel)
cv_show("cardImg_tophat",cardImg_tophat)
  • 之后就是边缘检测,寻找出图片里所有图形的边缘
sobelx =cv2.Sobel(cardImg_tophat,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
(minX,manX) = (np.min(sobelx),np.max(sobelx))
sobelx =(255*((sobelx-minX)/(manX-minX)))
sobelx = sobelx.astype('uint8')
cv_show("sobelx",sobelx)
  • 再使用函数腐蚀膨胀之后把大轮廓留下,小轮廓去除
cardImg_close = cv2.morphologyEx(sobelx,cv2.MORPH_CLOSE,rectKernel)
cardImg_binary =cv2.threshold(cardImg_close,0,255,cv2.THRESH_OTSU | cv2.THRESH_BINARY)[1]
cardImg_close = cv2.morphologyEx(cardImg_binary,cv2.MORPH_CLOSE,sqKernel)
cv_show("cardImg_close",cardImg_close)
  • 然后就是找到所有的大轮廓把大轮廓框选出来
cnts,h = cv2.findContours(cardImg_close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cardImg_cnts =cv2.drawContours(cardImg.copy(),cnts,-1,(0,0,255),2)
cv_show("cardImg_cnts",cardImg_cnts)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)
  • 最后就是和模板比对,并且把识别出的数字写在图片上
output = []
for (i,(x,y,w,h)) in enumerate(locs):group_output = []group = cardImg_gary[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,h= 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))score = []cv_show("roi",roi)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.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)

运行结果如下

OPENCV图片数字识别相关推荐

  1. OpenCV 图片数字识别(C++)

    下面是用C++来实现的 该算法的过程与上述相同,但该算法只使用第一层次的等高线,因此算法只对每一个数字使用相同的外部轮廓. 创建示例和标签数据的代码 #include <opencv2/open ...

  2. OpenCV车牌/数字识别

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

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

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

  4. opencv简易数字识别

    前言 使用opencv,进行简单的数字识别 注意:此案例中的数字识别仅当做学习参考,想要真正实现数字识别,实际情况复杂很多 思路 ①图片预处理,将图片转灰度后再二值化,使其变成白字黑底 ②查找外接矩形 ...

  5. Opencv实战——数字识别

    文章目录 前言 一.识别原理 二.代码实现 1.制作模板 2.样本识别 总结 前言 经过一段时间的python-opencv的学习,对opencv在图像处理方面的一些基本用法,既然学了,那就应该学以致 ...

  6. Tesseract-OCR 图片数字识别的样本训练

    最近想利用python写一段识别穿越火线交易所各种道具价格的代码.命令行执行: tesseract.exe grab.jpg result -l eng 使用默认的Tesseract语言库总会识别成字 ...

  7. 基于OpenCV的数字识别系统

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 综述 2012年iOS应用商店中发布了一个名为FuelMate的G ...

  8. 【图像算法】pytesseract简单实现图片数字识别

    [前置目的] 识别视频中是否包含目标元素: 抽象自动化,就是处理一段含有时间戳的视频: 再核心就是对视频进行图片裁减,识别出图片中的数字,做数学计算延时. [学习地址] 环境:mac.python3. ...

  9. python图片数字识别_python 识别图片上的数字

    https://blog.csdn.net/qq_31446377/article/details/81708006 ython 3.6 版本 Pytesseract 图像验证码识别 环境: (1) ...

最新文章

  1. python批量pdf转word,python批量实现Word文件转换为PDF文件
  2. 用koa mongodb 做了个简单的博客系统
  3. 30 分钟成交额破 3723 亿,天猫双 11 剁手主力军从哪儿来?
  4. 工作流引擎的硬功夫之1-表单自定义
  5. 2021-04-08 Python通过flask搭建音频流/文件服务
  6. javascript中操作字符串小结
  7. Hbase的应用场景、原理及架构分析(转:https://blog.csdn.net/xiangxizhishi/article/details/75388971)
  8. linux下oracle导出12705,llinux下Oracle数据库的单个表导出导入
  9. mysql alidata_linux下安装mysql | 学步园
  10. vnc远程无法关闭窗口_vnc远程画面不能控制,vnc远程画面控制不了是什么原因?原因详解...
  11. CSS单位em是相对于父元素还是当前元素的字体大小?
  12. phpwind升级php7,【原创文章】升级phpwind为https
  13. [C++项目]C++实现简易的酒店管理系统
  14. 单节锂电池充电管理芯片,IC电路图
  15. 硬件第一节 三级管电路工作原理及详解
  16. win10系统魔兽世界无法连接服务器地址,win10玩魔兽世界启动失败怎么办?请看过来...
  17. dedecms pm.php,dedecms /member/pm.php SQL Injection Vul
  18. jvm学习路线(简洁明了)
  19. 深入“无人地带”,快递企业能变更“快”吗?
  20. 同花顺服务器文件夹,同花顺的文件目录.doc

热门文章

  1. php实现手机归属地的查询,PHP实现手机归属地查询API接口
  2. 实验课题——最全手机通信录实现版本(【含注释】848行代码)!!!(包括模糊查询、分类查找、模拟拨号、qsort函数实现排序、文件存储、防误触等功能)
  3. ubuntu下如何控制风扇速度?
  4. ASP.NET 开发
  5. 毕业设计-基于web实现药房管理系统
  6. 关于 Alcohol 120%
  7. 第三章、C#简单界面在线聊天室C#一对多聊天(使用TCP转发实现的在线聊天室,文章末尾附免费项目资源)
  8. 毕业时制作的游戏demo
  9. Jmeter随机参数各种搭配
  10. php 优化 系统参数,Linux服务器系统参数优化