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日

相关文章

  • 深度学习笔记之卷积神经网络基本概念

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

    2023年4月8日
    00
  • 卷积神经网络——池化层学习——最大池化

    池化层(Pooling layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下。 先举一个池化层的例子,然后我们再讨论池化层的必要性。 假如输入是一个4×4矩阵,用到的池化类型是最大池化(max pooling)。 执行最大池化的树池是一个2×2矩阵。 执行过程非常简单,把4×4的输入拆分…

    2023年4月5日
    00
  • 《python深度学习》笔记—5、CNN的多个卷积核为什么能提取到不同的特征

    一、总结 一句话总结: 过滤器的权重是随机初始化的 只有卷积核学习到不同的特征,才会减少成本函数 随机初始化的权重可能会确保每个过滤器收敛到成本函数的不同的局部最小值。每个过滤器开始模仿其他过滤器是不可能的,因为这几乎肯定会导致成本函数的增加,梯度下降算法不会让模型朝这个方向发展。     二、CNN的多个卷积核为什么能提取到不同的特征 转自或参考:CNN的…

    卷积神经网络 2023年4月8日
    00
  • 神经网络卷积层 要回计算output的维度 input 28 卷积是3×3 则output是26 但是channel是卷积核的数量

      model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation=’relu’, input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation=’relu’)) model.add(MaxPooling2D…

    卷积神经网络 2023年4月7日
    00
  • 《基于深度卷积神经网络的实体关系抽取》笔记

    研究背景:传统的基于机器学习的方法针对不同的自然语言处理任务时需要使用不同的统计模型和优化算法,涉及大量手工挑选任务相关特征,同时选择结果、受到传统自然语言处理工具的影响,易造成误差传播。 这篇论文是基于CNN的模型,做出了两个小的改进:1.在初始输入为词向量和位置向量的基础上增加了类别关键词特征。2.在池化层选择分段最大池化策略,而不是一般的最大池化策略。…

    2023年4月6日
    00
  • 卷积神经网络在tenserflow的实现

    卷积神经网络的理论基础看这篇:http://blog.csdn.net/stdcoutzyx/article/details/41596663/ 卷积神经网络的tenserflow教程看这里:http://www.tensorfly.cn/tfdoc/tutorials/deep_cnn.html 卷积神经网络(convolutional neural ne…

    2023年4月8日
    00
  • 关于Tensorflow分布式并行策略

    下面我将为您详细讲解“关于Tensorflow分布式并行策略”的完整攻略,过程中会包含两条示例说明。 什么是TensorFlow分布式并行策略? 在单个设备上运行TensorFlow模型时,TensorFlow将模型的运算分配给单个CPU或GPU。在TensorFlow分布式并行策略中,TensorFlow使用多个设备来运行模型。这对于大型模型和数据集非常重…

    卷积神经网络 2023年5月15日
    00
  • 卷积层channel数量变化过程

      卷积神经网络的总体架构是金字塔型,如下图。 CNNs架构图 可以看到,每一层的channel数量是变化的。如上图中,左边的第一层只有R、G、B三个channel,第二层有16个channel,第三、四层分别有64、256个。 那么这些channel数量是如何变化的呢?   基本过程: 对于输入图片的每一个patch(下图中的绿色部分),运行一个具有K个输…

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