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

yizhihongxing
  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日

相关文章

  • C++实现简单BP神经网络

    下面是关于C++实现简单BP神经网络的攻略,包含两个示例说明。 示例1:定义BP神经网络类 以下是一个定义BP神经网络类的示例: #include <iostream> #include <vector> #include <cmath> using namespace std; class BPNeuralNetwork…

    卷积神经网络 2023年5月16日
    00
  • [转] 1*1卷积核作用

    妈蛋不让直接贴内容,那mark个地址吧: https://www.zhihu.com/question/56024942 第二个回答,图文并茂,直击要点。

    卷积神经网络 2023年4月6日
    00
  • 图像处理卷积算法实现

      今天心血来潮,想把传统的卷积算法实现一份不采用各种加速方式,仅优化算法逻辑的纯净版本。 写完发现性能还可以,特发出来分享之,若有博友在此基础上,进行了再次优化,那就更赞了。 算法很简单: inline unsigned char Clamp2Byte(int n) { return (((255 – n) >> 31) | (n & …

    2023年4月8日
    00
  • 卷积理论 & 高维FWT学习笔记

    之前做了那么多生成函数和多项式卷积的题目,结果今天才理解了优化卷积算法的实质。 首先我们以二进制FWT or作为最简单的例子入手。 我们发现正的FWT or变换就是求$\hat{a}_j=\sum_{i\in j}a_i$,即子集和,那这个是怎么来的呢? 我们假设$a$到$\hat{a}$的转移矩阵为$X$,则 $$(\sum_{j}X_{i,j}a_j)*…

    卷积神经网络 2023年4月8日
    00
  • loj #161 子集卷积

    求不相交集合并卷积   sol: 集合并卷积?看我 FWT! 交一发,10 以上的全 T 了 然后经过参考别人代码认真比对后发现我代码里有这么一句话: rep(s, 0, MAXSTATE) rep(i, 0, n) rep(j, 0, n – i) h[i + j][s] = inc(h[i + j][s], mul(f[i][s], g[j][s]));…

    卷积神经网络 2023年4月7日
    00
  • 卷积神经网络—padding、 pool、 Activation layer

    #coding:utf-8 import tensorflow as tf tf.reset_default_graph() image = tf.random_normal([1, 112, 96, 3]) in_channels = 3 out_channels = 32 kernel_size = 5 conv_weight = tf.Variable…

    卷积神经网络 2023年4月8日
    00
  • 空洞卷积(Atrous Convolution)的优缺点

    空洞卷积(atrous convolution)又叫扩张卷积(dilated convolution),其实就是向卷积层引入了一个称为“扩张率(dilation rate)”的新参数,这个参数定义了卷积核处理数据时各值的间距。普通卷积和空洞卷积图示如下(以3*3卷积为例)    (普通卷积)    (空洞卷积) 那么这样的结构是为了解决什么问题呢? 这又不得…

    2023年4月8日
    00
  • mnist深入–用卷积神经网络改善mnist

    文章链接: http://blog.csdn.net/yhl_leo/article/details/50624471    # load MNIST data import input_data mnist = input_data.read_data_sets(“Mnist_data/”, one_hot=True) # start tensorflow…

    卷积神经网络 2023年4月5日
    00
合作推广
合作推广
分享本页
返回顶部