【opencv】信用卡号识别实验

2024-05-13 23:52
文章标签 opencv 实验 识别 信用卡

本文主要是介绍【opencv】信用卡号识别实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验环境:anaconda、jupyter notebook(其它的ide也行)

实验用的包:numpy、matplotlib、opencv

实验目标:

识别信用卡的卡号

信用卡图片:

数字模板图片:

一、包引入

import cv2
import matplotlib.pyplot as plt
import numpy as np

二、数字模板特征提取

图片二值化处理

template = cv2.imread('template.png')# 灰度处理
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# 二值处理
ret,template_bin = cv2.threshold(template_gray,127,255,cv2.THRESH_BINARY_INV)plt.imshow(template_bin, 'gray')
plt.show()

数字模板二值化处理.png

检测数字模板外轮廓

# 只检测外轮廓
binary, template_contours, hierarchy = cv2.findContours(template_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
template_copy = template.copy()template_contours_img = cv2.drawContours(template_copy, template_contours, -1, (0,0,255),1)plt.imshow(template_contours_img)
plt.show()

数字模板外轮廓.png

找到外接矩形

# 外接矩形
tangles = []
template_copy = template.copy()
for cnt in template_contours:x,y,w,h = cv2.boundingRect(cnt)tangles.append((x,y,w,h))template_copy = cv2.rectangle(template_copy, (x, y), (x + w, y + h), (0,255,0), 2)
plt.imshow(cv2.cvtColor(template_copy, cv2.COLOR_BGR2RGB))
plt.show()
# 根据x值狠狠排序
tangles.sort()
print(tangles)

数字模板外接矩形.png

通过外接矩形截取数字图片

# 拿到数字对应的图片
number_size = (50,100)
digits = {}
for i in range(len(tangles)):(x,y,w,h) = tangles[i]digits[i] = cv2.resize(template_bin[y:y+h, x: x+w], number_size)plt.subplot(1,10,1 + i)plt.xticks([])plt.yticks([])plt.imshow(digits[i],'gray')
plt.show()

数字模板.png

三、信用卡卡面特征提取

初始化卷积核、处理卡片

# 初始化卷积核
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))# 读入信用卡图片
card = cv2.imread('card.png')
# 处理为灰度图
card_gray = cv2.cvtColor(card, cv2.COLOR_BGR2GRAY)
# 处理为礼帽处理
card_tophat = cv2.morphologyEx(card_gray, cv2.MORPH_TOPHAT, rectKernel)plt.imshow(card_tophat,'gray')
plt.show()

信用卡礼帽.png

对信用卡图片梯度处理

gradx = cv2.Sobel(card_tophat, ddepth=cv2.CV_32F, dx=1,dy=0, ksize=-1)
card_gradx = np.absolute(gradx)
(min_val,max_val) = (np.min(card_gradx), np.max(card_gradx))
card_gradx = (255 * ((card_gradx - min_val) / (max_val - min_val)))
card_gradx = card_gradx.astype('uint8')plt.imshow(card_gradx,'gray')
plt.show()

信用卡梯度处理.png

把特征轮廓合成一片,方便提取

闭操作

card_closing = cv2.morphologyEx(card_gradx, cv2.MORPH_CLOSE,rectKernel)plt.imshow(card_closing,'gray')
plt.show()

信用卡闭操作.png

二值化

# 二值化,自动判断
ret,card_bin = cv2.threshold(card_closing,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)plt.imshow(card_bin,'gray')
plt.show()

信用卡二值化处理.png

膨胀操作

# 膨胀操作,加强卡号特征
card_dilate = cv2.dilate(card_bin, rectKernel, iterations=1)plt.imshow(card_dilate,'gray')
plt.show()

信用卡膨胀.png

获取外轮廓

# 检测外轮廓
binary, card_contours, hierarchy = cv2.findContours(card_dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
card_copy = card.copy()card_contours_img = cv2.drawContours(card_copy, card_contours, -1, (0,0,255),2)plt.imshow(cv2.cvtColor(card_contours_img,cv2.COLOR_BGR2RGB))
plt.show()

此时拿到的外轮廓有很多不需要的地方

信用卡外轮廓.png

获取需要的外轮廓

card_copy = card.copy()
locs = []
for (i, sit) in enumerate(card_contours):(x,y,w,h) = cv2.boundingRect(sit)ar = w / float(h)if ar > 2.5 and ar < 4.0:if 65 < w < 70 and 15 < h < 25:locs.append((x,y,w,h))
locs.sort()
for (x,y,w,h) in locs:card_copy = cv2.rectangle(card_copy, (x, y), (x + w, y + h), (0,255,0), 2)plt.imshow(cv2.cvtColor(card_copy, cv2.COLOR_BGR2RGB))
plt.show()

信用卡卡号外轮廓提取.png

四、卡号识别

output = []
card_copy = card.copy()
for (i,(x,y,w,h)) in enumerate(locs):group_output = []# 获取每组卡号group = card_gray[y - 5 : y + h + 5, x - 5 : x + w + 5]# 转为二值图像ret, group = cv2.threshold(group,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 外轮廓检测binary, group_contours, hierarchy = cv2.findContours(group, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)data_sites = []for data_sit in group_contours:data_sites.append(cv2.boundingRect(data_sit))data_sites.sort()for (gx, gy, gw, gh) in data_sites:data = cv2.resize(group[gy : gy + gh, gx : gx + gw], number_size)scores = []# 计算分数for (digit, digit_img) in digits.items():result = cv2.matchTemplate(data, digit_img, cv2.TM_CCOEFF_NORMED)(_,score,_,_) = cv2.minMaxLoc(result)scores.append(score)group_output.append(str(np.argmax(scores)))cv2.rectangle(card_copy,(x - 5, y - 5), (x + w +5, y + h + 5), (0,255,0),2)cv2.putText(card_copy, "".join(group_output), (x, y - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0,0,255),2)output.extend(group_output)plt.imshow(cv2.cvtColor(card_copy, cv2.COLOR_BGR2RGB))
plt.show()
print(output)

成功识别卡号

信用卡卡号识别.png

这篇关于【opencv】信用卡号识别实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987163

相关文章

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传