范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

OCRopencv实现

  1 说明
  =====
  1.1 OCR(光学字符识别):
  该字体有几种用途,其中自动化系统需要定义标准的字符形状以正确扫描不使用条形码的数字和文本。
  OCR 应用的一些实例包括银行支票、护照、序列标签和邮件。
  OCR-A 和 OCR-B 字体有能够被 OCR 扫描设备准确读取的字符形状。
  1.2 OCR-A:
  1.2.1 源码下载,打不开https://en.wikipedia.org/wiki/OCR-A
  1.2.2 我用OCRAExtended.ttf代替OCRA.ttf也可以。
  2 效果图
  3 准备
  =====
  3.1 环境:
  python3.8+opencv4.2.0+deepin-linux深度操作系统+微软编辑器vscode。
  3.2 文件结果
  3.3 参考文章:#英文原版文章 https://www.pyimagesearch.com/2017/07/17/credit-card-ocr-with-opencv-and-python/ #中文文章 https://www.cnblogs.com/xujunjia/p/11456133.html #对源代码进行注释,排版,删减,修改bug,调试和运行
  3.4 本次银行卡为Visa,国内银行卡暂时不行。
  4 模板字体
  ========
  4.1 网上下载
  4.2 自己生成
  4.2.1 代码:import pygame from pygame.locals import * def main():     pygame.init()     screen = pygame.display.set_mode((1000, 450))  #窗口的大小     pygame.display.set_caption("OCRA数字模板")  #窗口标题,中文不需要特别的设置     background = pygame.Surface(screen.get_size())     background = background.convert()     background.fill((250, 250, 250))     #自己下载OCRAExtended.ttf     #显示中文的设置和字体,及路径,字体大小120比较好     font = pygame.font.Font("/home/xgj/Desktop/ocraI/OCRAExtended.ttf", 120)            text = font.render("0123456789", 1, (10, 10, 10))       textpos = text.get_rect()     textpos.center = background.get_rect().center     background.blit(text, textpos)     screen.blit(background, (0, 0))     pygame.display.flip()     while 1:         for event in pygame.event.get():             if event.type == QUIT:                 return                 screen.blit(background, (0, 0))                 pygame.display.flip()  if __name__ == "__main__":      main()
  4.2.2 图
  截图并命名为:card1.png
  5 代码
  ====
  5.1 myutils.py(自建模块被引用)import cv2  def sort_contours(cnts, method="left-to-right"):     reverse = False     i = 0      if method == "right-to-left" or method == "bottom-to-top":         reverse = True      if method == "top-to-bottom" or method == "bottom-to-top":         i = 1     boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w     (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),                                         key=lambda b: b[1][i], reverse=reverse))      return cnts, boundingBoxes 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 image     if 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
  5.2 bankcardre.py(主程序代码) #第1步:模块导入 import  cv2 import numpy as  np import myutils  #自建模块被引用 from imutils import contours  #第2步:指定信用卡类型,国内银行卡暂时不行 FIRST_NUMBER = {     "3": "American Express",     "4": "Visa",     "5": "MasterCard",     "6": "Discover Card" }  #第3步:显示函数定义 #因为需要展示的图片比较多,这样打包显得代码简洁 def cv_show(str,thing):     cv2.imshow(str, thing)     cv2.waitKey(0)     cv2.destroyAllWindows()  #第4步:数字字体模板导入和处理 img=cv2.imread("/home/xgj/Desktop/bankcardre/card1.png") # 灰度图 ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #二值化 ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1] cv_show("img_ref",ref)  # 计算轮廓 #cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图) #cv2.RETR_EXTERNAL只检测外轮廓,cv2.CHAIN_APPROX_SIMPLE只保留终点坐标 #返回的list中每个元素都是图像中的一个轮廓 #下面bug,注释掉,删除一个ref_ #ref_,refCnts,hierarchy=cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  refCnts,hierarchy=cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  cv2.drawContours(img,refCnts,-1,(0,0,255),3) cv_show("img",img)  #print (np.array(refCnts).shape)  #注释掉否则报错 refCnts = myutils.sort_contours(refCnts, method="left-to-right")[0]#排序,从左到右,从上到下  digits = {}   for (i, c) in enumerate(refCnts):     # 计算外接矩形并且resize成合适大小     (x, y, w, h) = cv2.boundingRect(c)     roi = ref[y:y + h, x:x + w]     roi = cv2.resize(roi, (57, 88))      # 每一个数字对应每一个模板     digits[i] = roi  # 初始化卷积核 rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3)) sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))   #第5步:银行卡图片处理 #读取需要识别的银行卡的图片,预处理 image = cv2.imread("/home/xgj/Desktop/bankcardre/1.png") cv_show("image",image) image = myutils.resize(image, width=300) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv_show("gray",gray)  #礼帽操作,突出更明亮的区域 tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel) cv_show("tophat",tophat) #ksize=-1相当于用3*3的 gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)   gradX = np.absolute(gradX) (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("gradX",gradX) #通过闭操作(先膨胀,再腐蚀)将数字连在一起 gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel) cv_show("gradX",gradX) #THRESH_OTSU会自动寻找合适的阈值,适合双峰,需把阈值参数设置为0 thresh = cv2.threshold(gradX, 0, 255,     cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] cv_show("thresh",thresh) #再来一个闭操作  thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel) #再来一个闭操作 cv_show("thresh",thresh)  # 计算轮廓 #修改bug #hresh_, threshCnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  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("img",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):     # initialize the list of group digits     groupOutput = []      # 根据坐标提取每一个组     group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]     cv_show("group",group)     # 预处理     group = cv2.threshold(group, 0, 255,         cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]     cv_show("group",group)     # 计算每一组的轮廓,注释掉,修改bug     #group_,digitCnts,hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)          digitCnts,hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)     digitCnts = contours.sort_contours(digitCnts,         method="left-to-right")[0]      # 计算每一组中的每一个数值     for c in digitCnts:         # 找到当前数值的轮廓,resize成合适的的大小         (x, y, w, h) = cv2.boundingRect(c)         roi = group[y:y + h, x:x + w]         roi = cv2.resize(roi, (57, 88))         cv_show("roi",roi)          # 计算匹配得分         scores = []          # 在模板中计算每一个得分         for (digit, digitROI) in digits.items():             # 模板匹配             result = cv2.matchTemplate(roi, digitROI,                 cv2.TM_CCOEFF)             (_, score, _, _) = cv2.minMaxLoc(result)             scores.append(score)          # 得到最合适的数字         groupOutput.append(str(np.argmax(scores)))      # 画出来     cv2.rectangle(image, (gX - 5, gY - 5),         (gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)     cv2.putText(image, "".join(groupOutput), (gX, gY - 15),         cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)      # 得到结果     output.extend(groupOutput)  #第6步:终端显示和结束 # 打印结果 print("Credit Card Type: {}".format(FIRST_NUMBER[output[0]]))  print("Credit Card #: {}".format("".join(output))) cv2.imshow("Image", image) cv2.waitKey(0)
  6 小结
  ====
  6.1 python和opencv的银行卡数字识别为主,目前以美国银行卡识别为主,国内银行卡识别类似。
  6.2 注意数字模板OCR-A字体的相关知识复习和模板生成。
  6.3 本文介绍比网上的介绍更全面和更细致,更容易懂,适合收藏。
  效果图

章龄之自责在陪孩子上网课期间,对孩子发脾气,韩雪看后便鼓励她作为妈妈,都希望自己不要对孩子发脾气,一直做一个温和的妈妈。但是很多时候,妈妈看到孩子的一些不如意的表现时,就会不自觉地对孩子发起脾气来。对于妈妈来说,对孩子发脾气时没有去考虑自己父母的坏情绪对孩子影响最大许多父母在面对孩子的坏习惯时,往往会很头疼,没说几句话就忍不住大发脾气,开始对孩子指责谩骂,什么话难听说什么。经常这样做只会降低父母在孩子心中的威信,破坏孩子的安全感和归属感,让他伊能静你给孩子足够的爱时,孩子也会足够爱你对于孩子来说,世界上任何东西都取代不了妈妈在自己心目中的位置。妈妈从小给孩子足够的爱和关注,从而让孩子拥有满满的安全感,这样孩子就不会感到爱的匮乏,她自然就会和妈妈之间有一个很好的心理学中的霍桑效应所谓的霍桑效应指的是当人们意识到自己被别人关注的时候,会刻意改变行为的一种现象,也被成为宣泄效应。美国芝加哥有个制造电话交换机的工厂,由于工人们对工厂的管理人员和一些制度措施很不满九年了!金晨再次回到舞台,一切没变,她还是之前那个自信的女孩说到金晨,让我们想起2011年舞动奇迹中她那出色舞蹈表演。虽然那时她只有21岁,但是她却很有自信。在节目中,她和黎诺懿组成的一诺千金组合,在第三季比赛中,获得冠军。其实金晨一直就很为啥儿子七岁了,宝妈才决定要二胎?答案宝爸给的勇气婷婷现在终于开始要二胎了,当大家听到这个好消息后,都感到很意外。因为一直以来,婷婷就坚持不要二胎,她认为就把一个孩子养好就可以了。以前无论身边的人如何劝她让她要二胎,但是婷婷一直坚黄圣依喜欢给孩子买益智的玩具,而杨子喜欢买孩子喜欢的玩具对于孩子来说,无论家里有多少玩具,对于他来说,也不多,因此孩子对玩具的需求从来没有停止过。很多时候孩子更喜欢让父母给他们买他们喜欢的玩具,而父母更倾向于给孩子买一些益智的玩具。在父孩子躲在门后偷吃糖果,自制力不足?3个方法提高孩子的自控能力三岁孩子趁妈妈做饭时,自己躲在卧室里门后偷吃糖果周六中午,妈妈正在厨房做饭,这时三岁的亮亮正躲在自己的小卧室门后,偷偷地吃糖果。妈妈在没有做饭之前,就安排亮亮先把玩具和书本整理好,三岁男孩说乐高太难拼了,我还是不玩了随后妈妈的举动很赞晨晨妈咪原创,欢迎大家阅读分享和点赞!周末,三岁的小C在房间里搭乐高,妈妈在客厅忙其它的事情,突然小C走到客厅对妈妈说乐高,太难了,我无论怎么拼,就拼不好,我还是不玩了。妈妈听到小姥姥缝百家被盼早产外孙女平安每一针一线都代表对孩子爱文晨晨妈咪,本文原创,欢迎大家阅读点赞和分享!每当一个新生命诞生,不但作为孩子的父母,会感到很开心,同样作为孩子的爷爷奶奶或姥姥爷爷同样也是对孩子充满了欢喜。因此,作为孩子的爷爷奶老板我不干了,每天受不完的气职场妈妈的崩溃,就在这一瞬间本文晨晨妈咪原创,欢迎大家一起点赞分享和阅读!昨天下午和宝宝一起去站点取快递,看到那个经常给我们拿快递的宝妈瞬间大哭起来。其实这位妈妈总体感觉性格各方面还是比较好,她有两个可爱的孩
河南一妈妈工地带娃,孩子捡玩具掉到地基坑,消防员巧用绳子救人每一位母亲带孩子都十分小心,生怕一不留神出现意外,发生让自己后悔一辈子的事情。可意外是没有办法预测的,遇到紧急情况,要及时求助相关部门处理,尽可能挽回损失。近日,在河南新乡,有一位这就是爱情!合肥一对夫妻带着行李露宿街头,男子在旁边细心照顾不离不弃才是夫妻!以前结婚只需要两情相悦,为了爱情不管对方贫穷还是富有,只要我看上你了,以后遇见什么困难坚决不分开。如今,年轻人结婚之前需要物质基础,买房买车成了标准,没钱很难遇见8个过来人告诉您婚姻和恋爱的真相到底是什么?老王记得,张震岳有一首歌是不是我的十八岁,注定要为爱情流泪?其实就算是你十八岁没有为爱情流泪,二十八三十八四十八哪怕是到了九十八,也会把十八岁那年没有流过的泪都补上的。得与失得与失没删你,但也不联系人,是在不知不觉中走散的有些感情可以轰轰烈烈的开始但也可以一言不发的无疾而终最初不相识最终不相认最是遗憾,无疾而终小时候和喜欢的人有了隔阂会忍不住跑去质问对方你为什么不理我长大后不西贝莜面村,出新品啦,快去吃在西安有这么一家店,被列为世界非物质文化遗产美食,曾经两次走进联合国,在全国50多个城市有350多家门店,它就是每天排队到爆的,西贝莜面村这次西贝又带了一波新菜品,而且新品就在咱们一切怀才不遇,都有迹可寻我不知道最近你的朋友圈里,有没有被各种各样的新年flag刷屏,反正我的朋友圈,已经被健身看书学乐器等这几种热门flag攻陷了,也不知道从那一天开始,年初立flag目标,已经成为了现排队到腿软,西安石家包子,吃一口我就沦陷了作为一枚苦的中年油腻男每天早起风风火火的狂奔在路上就像打仗似的,这都不算什么每天上班最悲催的是到了公司,早饭没吃如果你也和老王一样还为早餐而发愁试试西安最具人气的top1包子,石家面对父母的催婚,是该欣然接受,还是该严词拒绝?老王身边结婚的同学朋友越来越多,没结婚的不是在相亲就是在被催婚的路上。对于80后来说,每逢过年过节都不怎么愿意回家,当然没钱是一方面,但最为致命的大概就是催婚了。很多的父母都觉得自婆媳关系的好坏,会不会影响夫妻感情?大家都说,婆媳关系好坏肯定会影响夫妻感情,婆媳处的好夫妻感情大多也会和睦幸福,家庭气氛融洽。处不好会让男人夹在中间很难做,调节不好可能会由婆媳矛盾演变为夫妻矛盾。其实,大多数人觉得婆媳关系不和?会影响夫妻关系?已婚的朋友给老王说,婆媳关系难相处,如果婆媳关系可以不和,夫妻双方之间的感情也难免会由于受到影响波及。甚至需要有人说遇到这样一个明事理的婆婆,比嫁个好老公还重要,可见婆媳关系管理对梳理写作初心,持续笔耕一直以来喜欢文字和阅读,曾经也开通了公众号,定的周更,但是都没有坚持下来。今天听了弘丹老师讲有关写作的几个误区,发现自己多次中招了,也给了我很大的信心坚持写作之路。我为什么要重新开