银行卡号定位

本来写这个是想在代做群里挣点儿小外快的,结果人家撤销了任务。。。哭晕在厕所QAQ。
这次软件杯基于深度学习的银行卡号识别系统有个功能性模块儿是银行卡号定位,我觉得这个比赛还是蛮难的,因为当我看见他们的测试银行卡后整个人都不好了!

这是一群大学生该干的事儿嘛!!!这花里胡哨的纹路和颜色真的令人脱发哎!!!
不过为了小钱钱还是得试一试,颜色识别是肯定不行了,这数字都进化出保护色了。所以就来了一下canny边缘检测加膨胀腐蚀看能不能把那串数字搞出来。

import cv2
import numpy
# 读取图片并改变尺寸为(800x400),转灰度图
img0 = cv2.imread("1.jpg")
img0 = cv2.resize(img0, (800,400), interpolation=cv2.INTER_AREA)
img = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
cv2.namedWindow("org")
# 给定形态学操作内核,对图像进行Canny检测和形态学操作
kernel = np.ones((3, 3), np.uint8)
newimg = cv2.Canny(img, 170, 100)
newimg = cv2.morphologyEx(newimg, cv2.MORPH_CLOSE, kernel)cv2.imshow("org", newimg)
cv2.waitKey()
cv2.destroyAllWindows()


然后就成了这个鬼样子。。。也不知道有没有什么好的方法把那些纹路去掉,反正我是去不掉了,不过还好,我的任务只是卡号定位。替需要提取所有数字识别的参赛的兄弟们捏一把汗2333
不难发现银行卡号有个规律,它是很长的一串数字并且字形和对其非常严格,遂心生一计,将图片resize为固定大小(800x400),再将符合卡号字形大小的单位用最小矩形框选出来

# 提取图像内单元的最小矩形
image_contours, contours, hier = cv2.findContours(newimg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):cnt = contours[i]x, y, w, h = cv2.boundingRect(cnt)''' 选择符合字体大小的最小矩形塞进point列表里 '''if 50>w>10 and 50>h>10:point.append(add_cont(x,y,w,h))
for o in range(len(point)):for i in range(len(point)):'''出现了!核心思想2333,把起点y坐标绝对距离小于5像素的矩形框个数找出来''''''(相当于找出同一排单元 PS:卡号在一行)'''if 0 < abs(point[o][1] - point[i][1]) < 5:tent += 1elif abs(point[o][1] - point[i][1]) == 0:if point[o][0] != point[i][0]:tent += 1'''如果同一行单元个数大于6则认定为卡号''''''至于为啥,你看,银行卡上第二长的一排字是银行名称,其中最长中国邮政银行6个字'''if tent > 6:tent = 0target.append(point[o])

找到目标所在的大致范围后,我们就可以把其余的糟糕的线条和元素统统去掉

newimg[0:target[0][1]-3,0:800] = 0
newimg[target[0][1]+target[0][3]+3:400, 0:800] = 0

于是我们得到了卡号在的那一排

瞬间神清气爽有没有啊!虽然他还是遗传甲骨文,但是我的目标又不是识别2333。
接下来再对得到的newimg来一波最小矩形框选,这次的最小矩形就需要选小一点的规格了,力求将newimg里的所有卡号单元全部选中,因为此时的噪点只是银行卡那纤细的边缘,其余的元素都是我们要的

# 你得先把前面存最小矩形框里的元素清空
point = []
target = []
image_contours, contours, hier = cv2.findContours(newimg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 把newimg上的卡号元素框出来,能不能框全都无所谓啦,第一个和最后一个能框出来就行
for i in range(len(contours)):cnt = contours[i]x, y, w, h = cv2.boundingRect(cnt)if 50>w>3 and 50>h>3:point.append(add_cont(x,y,w,h))

接下来用起泡法(什么排序法都可以)把刚刚框选的最小框里最小的x,y坐标,最大的x坐标,宽高w,h选出来,得到最终卡号串矩形框的起始startx,finaly坐标和finalw,finalh宽高。
这时候,在原图上绘出最终矩形框,卡号就被定位啦!接下来截取出来你想怎么处理就怎么处理咯
效果图:

源码奉上!

import cv2
import numpy as np
from scipy import ndimage
# 添加矩形框元素
def add_cont(x, y, w ,h):p = []p.append(x)p.append(y)p.append(w)p.append(h)return p
# 起泡法排序返回最大or最小值
def bubble_sort(a, w, s):'''w: 要取的x,y,w,h元素,对应0,1,2,3''''''s: 0取最小值, 1取最大值'''b = []temp = 0for i in range(len(a)):b.append(a[i][w])b.sort()if s:return b[len(b)-1]else:return b[0]tent = 0
startx = 0
finalx = 0
finaly = 0
finalw = 0
finalh = 0
point = []
target = []
img0 = cv2.imread("1.jpg")
img0 = cv2.resize(img0, (800,400), interpolation=cv2.INTER_AREA)
img = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
cv2.namedWindow("org")
kernel = np.ones((3, 3), np.uint8)
newimg = cv2.Canny(img, 170, 100)
newimg = cv2.morphologyEx(newimg, cv2.MORPH_CLOSE, kernel)
image_contours, contours, hier = cv2.findContours(newimg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):cnt = contours[i]x, y, w, h = cv2.boundingRect(cnt)if 50>w>10 and 50>h>10:point.append(add_cont(x,y,w,h))
for o in range(len(point)):for i in range(len(point)):if 0 < abs(point[o][1] - point[i][1]) < 5:tent += 1elif abs(point[o][1] - point[i][1]) == 0:if point[o][0] != point[i][0]:tent += 1if tent > 6:tent = 0target.append(point[o])
newimg[0:target[0][1]-3,0:800] = 0
newimg[target[0][1]+target[0][3]+3:400, 0:800] = 0
point = []
target = []
image_contours, contours, hier = cv2.findContours(newimg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):cnt = contours[i]x, y, w, h = cv2.boundingRect(cnt)if 50>w>3 and 50>h>3:point.append(add_cont(x,y,w,h))
finalx = bubble_sort(point, 0, 1)
startx = bubble_sort(point, 0, 0) - 3
finaly = bubble_sort(point, 1, 0) - 3
finalw = finalx + bubble_sort(point, 2, 1)
finalh = finaly + bubble_sort(point, 3, 1) + 10
print("startx = "+ str(startx))
print("starty = "+ str(finaly))
print("width = "+ str(finalw))
print("height = "+ str(finalh))
# 画出矩形框
cv2.rectangle(img0,(startx,finaly),(finalw, finalh),(0, 255, 0),2)
cv2.imshow("org", img0)
cv2.waitKey()
cv2.destroyAllWindows()

祝诸君比赛顺利哦

银行卡号定位(python3)相关推荐

  1. 银行卡号定位与识别系统

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 功能介绍 在这里因为给定的数据集都是每一个上有四个数字(有些为空格),但是所识别的最终目标-- ...

  2. pyflink+alink使用

    1.部署alink pip3 install pyalink-flink-1.11 --user --proxy=http://10.88.0.441:701189 2.下载需要的包 download ...

  3. selenium 鼠标悬浮_处理Selenium3+python3定位鼠标悬停才显示的元素

    先给大家介绍下Selenium3+python3--如何定位鼠标悬停才显示的元素 定位鼠标悬停才显示的元素,要引入新模块 # coding:utf-8 from selenium import web ...

  4. python3打包成exe运行 无法定位程度输入点_Pyinstaller递归错误解决方案

    layout: post title: Pyinstaller递归错误解决方案 date: 2018-06-18 categories: blog tags: [递归错误,py,python,Maxi ...

  5. python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容

    python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容 1 pyzbar二维码检测模块 1.1. pyzbar模块介绍 1.2 pyzbar ...

  6. Ubuntu安装了Python2和Python3,无法定位pip3

    环境 Ubuntu 14.06 安装python2,版本为Python 2.7.12 安装python3,版本为Python 3.5.2 问题描述 由于使用python3需要beautifulsoup ...

  7. python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...

    [本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 代码如下: import os import sys __all ...

  8. python中xpath定位下拉菜单_Selenium2+Python3.6实战(八):定位下拉菜单出错,如何解决?用select或xpath定位。...

    在登录界面,有时候会有几种不同的角色,针对不同角色定位到的信息是不一样的.查询资料知道定位下拉框的元素有两种方式:Xpath和select. 但是使用xpath定位时,user定位到了,登录的时候却是 ...

  9. python3实现二维码定位及识别

    一.功能需求 通过opencv及pyzbar库将图片中的二维码边界定位出来,然后再通过pyzbar识别二维码的信息 参考文章 参考代码 import cv2 as cv from pyzbar imp ...

最新文章

  1. 探React Hooks
  2. prism项目搭建 wpf_WPF Step By Step 系列-Prism框架在项目中使用
  3. print输出 pytorch_pytorch 实现打印模型的参数值
  4. 【云图】一键生成连锁店品牌地图
  5. 折半查找法(二分查找法)
  6. 分布式映射与集中式映射_K映射上的表达式映射和组包围
  7. 怎么做手机的上下滑动_diy滴胶手机壳到底怎么做呢?
  8. cad中lisp文件给恶作剧_CAD中LISP程序使用方法
  9. Linux C语言在用户态实现一个低时延通知(eventfd)+轮询(无锁队列ring)机制的消息队列
  10. 服务器系统自带ftp,win10如何使用自带FTP服务器
  11. Memcached的Web管理工具MemAdmin(待实践)
  12. springboot中Word转PDF
  13. Linux--rpm、yum等安装软件
  14. ArcGIS 对起伏度、坡度和道路等及进行重分类处理
  15. MongoDB客户端Robo 3T安装使用
  16. Windows下设置Mongodb用户名密码
  17. 从根源上解决libc.so.6版本问题 /lib64/libc.so.6:version 'GLIBC_XXX' not found
  18. linux双系统无u盘安装教程视频教程,window 与Linux Mint 双系统U盘安装方法
  19. 使用Beep()函数发出指定音高 (一)
  20. 便利店牵手京东到家,多元零售矩阵走向成熟化

热门文章

  1. IDEA 断点:断点失效问题
  2. 基于微信小程序+springboot的在线商城系统毕业设计源码
  3. 国内常用的ntp服务器
  4. 机器学习 | MATLAB实现BP神经网络newff参数设定(上)
  5. 自动驾驶的核心技术是什么----一篇文章带你揭开自动驾驶的神秘面纱
  6. axios发送x-www-form-urlencoded格式数据
  7. 程序员是怎么安排电脑桌面的
  8. 日内趋势票如何把握?
  9. Python搭建简单的web服务器
  10. java判断垃圾已回收_[译] 现代垃圾回收