Python OpenCV实现识别信用卡号教程详解

  1. 介绍OpenCV和Python

OpenCV是一个开源的计算机视觉库,能够实现图像处理、机器学习、目标检测、人脸识别等功能。Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,具有易学易用、扩展性强等优点。Python可以利用OpenCV实现多种计算机视觉任务, 许多图像处理和计算机视觉的应用程序都采用了这种组合。

  1. 信用卡识别的背景介绍

在一些电商平台或者其他网站上,用户需要输入信用卡号码才能完成交易。为了提升用户体验和操作效率,有必要采用自动识别技术。本教程将提供通过Python OpenCV实现信用卡号码识别的方法,能够自动识别信用卡号码进行支付。

  1. Python OpenCV安装

在Python环境下,我们可以使用pip命令安装OpenCV依赖和库:

pip install opencv-python

如果需要利用摄像头进行测试,还需要安装摄像头相关的库:

pip install opencv-contrib-python
  1. 提取信用卡区域

提取信用卡区域是信用卡识别的第一步,我们可以借助OpenCV提供的边缘检测算法和形态学操作实现这一步骤。具体步骤如下:

1) 使用Canny边缘检测算法探测图像的边缘。

2) 对图像进行形态学处理,包括膨胀和腐蚀。

3) 提取轮廓,寻找最大轮廓并切割出信用卡区域。

import cv2

image = cv2.imread('credit_card.png')

# 将图像转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算法探测图像的边缘
edged = cv2.Canny(gray, 50, 200)

# 对图像进行形态学处理,包括膨胀和腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)

# 提取轮廓,寻找最大轮廓并切割出信用卡区域
cnts, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = box.astype(int)
cv2.drawContours(image, [box], -1, (0, 255, 0), 2)
  1. 提取信用卡号码

在提取信用卡号码时,我们首先需要将信用卡区域变换到适当的方向以便后续处理,然后使用现代OCR技术提取信用卡号码。具体步骤如下:

1) 将信用卡区域按照适当的角度旋转。

2) 将信用卡区域变换到标准大小,以便后续处理。

3) 利用现代OCR技术提取信用卡号码。

import pytesseract
import numpy as np

image = cv2.imread('credit_card.png')

# 将图像转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 将信用卡区域变换到适当的方向
rect = cv2.minAreaRect(box)
angle = rect[-1]
if angle < -45:
    angle = -(90 + angle)
else:
    angle = -angle
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 将信用卡区域变换到标准大小
resized = cv2.resize(rotated, (450, 300))

# 提取信用卡号码
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
id_box = gray[80:180, 140:380]
thresh = cv2.threshold(id_box, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = np.ones((5, 5), np.uint8)
eroded = cv2.erode(thresh, kernel, iterations=1)
dilated = cv2.dilate(eroded, kernel, iterations=1)
id_number = pytesseract.image_to_string(dilated, lang='eng', config='--psm 6')
  1. 完成信用卡识别

将第4步和第5步的代码相结合,就可以实现信用卡号码的识别,以下是完整代码:

import cv2
import pytesseract
import numpy as np

image = cv2.imread('credit_card.png')

# 将图像转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算法探测图像的边缘
edged = cv2.Canny(gray, 50, 200)

# 对图像进行形态学处理,包括膨胀和腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)

# 提取轮廓,寻找最大轮廓并切割出信用卡区域
cnts, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = box.astype(int)
cv2.drawContours(image, [box], -1, (0, 255, 0), 2)

# 将信用卡区域按照适当的角度旋转
angle = rect[-1]
if angle < -45:
    angle = -(90 + angle)
else:
    angle = -angle
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 将信用卡区域变换到标准大小
resized = cv2.resize(rotated, (450, 300))

# 提取信用卡号码
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
id_box = gray[80:180, 140:380]
thresh = cv2.threshold(id_box, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
kernel = np.ones((5, 5), np.uint8)
eroded = cv2.erode(thresh, kernel, iterations=1)
dilated = cv2.dilate(eroded, kernel, iterations=1)
id_number = pytesseract.image_to_string(dilated, lang='eng', config='--psm 6')

print(id_number)

其中,上述代码中使用的信用卡图像(credit_card.png)可通过以下代码生成:

import numpy as np
import cv2

image = np.zeros((300, 500, 3), dtype='uint8')
cv2.rectangle(image, (0, 0), (500, 300), (255, 255, 255), -1)
cv2.rectangle(image, (50, 50), (450, 250), (0, 0, 0), -1)
cv2.putText(image, '1234 5678 9101 1121', (70, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 2)
cv2.imwrite('credit_card.png', image)

通过以上步骤,我们就可以实现Python OpenCV实现识别信用卡号的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python OpenCV实现识别信用卡号教程详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类

    目录: 冰山图片识别背景 数据介绍 数据预处理 模型搭建 结果分析 总结   一、冰山图片识别背景 这里我们要解决的任务是来自于Kaggle上的一道赛题(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge),简单介绍一下赛题的背景:在加拿大的东海岸经常会有漂流的冰山,这对航行在该海域的船…

    卷积神经网络 2023年4月7日
    00
  • 如何用Python 实现景区安防系统

    如何用Python实现景区安防系统 介绍 随着旅游业的发展,景区越来越受到人们的欢迎。同时,景区的安全问题也备受关注。为了保障游客的人身财产安全,景区管理部门需要建立一套完善的安防系统。本文将介绍如何用Python实现景区安防系统。 前置条件 在开始实现景区安防系统之前,我们需要准备以下硬件设备: 摄像头(可采用网络摄像头或USB摄像头) 树莓派(作为中心控…

    卷积神经网络 2023年5月15日
    00
  • 深度学习面试题19:1*1卷积核的作用

      举例   在Inception module上的应用   参考资料 可以减少计算量,可以增加非线性判别能力 举例 假设有1个高为30、宽为40,深度为200的三维张量与55个高为5、宽为5、深度为200的卷积核same卷积,步长=1,则结果是高为30、宽为40、深度为55的三维张量,如图所示: 该卷积过程的乘法计算量大约为5*5*200*30*40*55…

    卷积神经网络 2023年4月7日
    00
  • TensorFlow中卷积 CNN中的卷积核及TensorFlow中卷积的各种实现

    声明: 1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论。 2. 我不确定的地方用了“应该”二字 首先,通俗说一下,CNN的存在是为了解决两个主要问题: 1. 权值太多。这个随便一篇博文都能解释 2. 语义理解。全连接网络结构处理每一个像素时,其相邻像素与距离很远的像素无差别对待,并没有考虑图像内容的…

    卷积神经网络 2023年4月8日
    00
  • 卷积、卷积核的维数、尺寸

      最近看论文的时候,接触到了3-D卷积的知识,在找的过程中,发现“卷积、卷积核的维数、尺寸”这篇文章写的较详细,就搬运了过来,只是为了以后查找方便。 注:如果原作者看到,如果觉得不妥,我可以马上删掉这篇文章!!!

    卷积神经网络 2023年4月8日
    00
  • 卷积公式 相关证明

    对给定函数f(t),g(t)拉普拉斯变换得 将上面二式相乘,并建立下面的等式 这意味着两个函数分别进行拉普拉斯变换的结果相乘等于某个未知函数h(t)进行一次拉普拉斯变换的结果, 现在问题变成了求解h(t),过程如下: 上面推理过程,主要考虑到定积分可以看作是数列求和的极限,比如两个数列相乘可以进行如下转化:      

    卷积神经网络 2023年4月7日
    00
  • 浅析PyTorch中nn.Linear的使用

    浅析PyTorch中nn.Linear的使用 介绍 在深度学习中,神经网络是一个重要的概念,神经网络模型通常由多个线性和非线性层构成。然而,在神经网络中,参数调节是一个关键问题。为了解决这个问题,使用反向传播算法来计算误差并调整网络参数是一种常见的方法。 PyTorch是一种基于Torch的开源机器学习库,它具有动态图的优势,可以方便地定义和训练神经网络模型…

    卷积神经网络 2023年5月15日
    00
  • 深度学习笔记之卷积神经网络基本概念

    1.最简单的神经网络示意图 其分为输入层、输出层、隐藏层对于这样一个最简单的神经网络,只有一个隐藏层在图中,连线代表此神经元是由上一层的结点,通过一定的运算得到的。也就是说我们定义好输入层的值和其结点的运算方式,我们就可以得到下一层的结点所对应的值 2.感知器 感知器是第一个具有完整算法描述的神经网络算法(感知器学习算法:PLA)任何线性分类或线性回归问题都…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部