Python+OpenCV实现信用卡数字识别的方法详解

Python+OpenCV实现信用卡数字识别的方法详解

介绍

本文将介绍如何使用Python和OpenCV(Open Source Computer Vision Library)来实现信用卡数字的识别。首先,我们需要从信用卡的照片中提取数字图像,然后使用数字识别模型来识别它们。本文将演示使用轮廓检测和二值化等技术来提取数字图像,以及使用深度学习方法构建数字识别模型。

环境

  • Python 3.x
  • OpenCV 4.x
  • Numpy
  • Tensorflow 2.x

提取数字图像

首先,我们需要按照以下步骤从信用卡图像中提取数字:

1. 加载图像

使用OpenCV加载信用卡照片。我们可以使用cv2.imread()函数。

import cv2

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

2. 灰度化

将图像转换为灰度图像,这可以简化我们的处理过程。

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

3. 边缘检测

使用canny边缘检测算法查找数字的轮廓。由于数字是黑色的,我们可以使用高亮轮廓的形式查找它们。因此,我们需要把图像颜色反转(将黑色变为白色,将白色变为黑色),以便于找到数字的轮廓。

edged = cv2.Canny(gray, 100, 200)
edged = cv2.bitwise_not(edged)

4. 提取数字区域的轮廓

使用cv2.findContours() 函数来提取数字区域的轮廓。该函数返回一组轮廓,并且我们可以通过选择特定的阈值来获得我们感兴趣的数字的轮廓。我们可以使用cv2.RETR_EXTERNAL 标记来找到仅包围数字的轮廓。

contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

5. 确定数字区域位置和大小

对于每个找到的数字轮廓,我们可以使用cv2.boundingRect()函数计算其位置和大小。

digit_rects = []
for contour in contours:
    (x, y, w, h) = cv2.boundingRect(contour)
    digit_rects.append((x, y, w, h))

6. 显示数字区域

现在,我们可以使用cv2.rectangle()函数在原始图像中显示数字区域。

for rect in digit_rects:
    x, y, w, h = rect
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

数字识别模型

接下来,我们将介绍如何使用深度学习方法构建数字识别模型。

1. 数据预处理

首先,我们需要准备数据集。我们可以使用MNIST(Modified National Institute of Standards and Technology)手写数字数据集来训练我们的模型。MNIST数据集包含70,000个手写数字的图像,其中60,000个用于训练,10,000个用于测试。

from tensorflow.keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

2. 构建模型

本文将使用深度卷积神经网络来训练模型,使用TensorFlow 2.x编写代码。

import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.Reshape((28, 28, 1), input_shape=(28, 28,)),
    tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    tf.keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(10, activation='softmax')
])

3. 训练模型

现在,我们可以使用MNIST数据集来训练我们的模型。

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))

示例

接下来,我们将提供两个示例来展示本文所述的技术:

示例1:提取信用卡上的数字

import cv2

# 加载图像
image = cv2.imread('credit_card.jpg')

# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 边缘检测
edged = cv2.Canny(gray, 100, 200)
edged = cv2.bitwise_not(edged)

# 提取数字区域的轮廓
contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 确定数字区域位置和大小
digit_rects = []
for contour in contours:
    (x, y, w, h) = cv2.boundingRect(contour)
    digit_rects.append((x, y, w, h))

# 显示数字区域
for rect in digit_rects:
    x, y, w, h = rect
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

# 显示结果图像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例2:识别手写数字

import cv2
import numpy as np
import tensorflow as tf

# 加载模型
model = tf.keras.models.load_model('mnist_model.h5')

# 加载图像
image = cv2.imread('digit.jpg', cv2.IMREAD_GRAYSCALE)

# 二值化
_, image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 提取轮廓
cnts, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 提取每个数字并进行识别
for cnt in cnts:
    x, y, w, h = cv2.boundingRect(cnt)

    # 调整数字大小
    if w > h:
        h = w
    else:
        w = h

    cx = x + w // 2
    cy = y + h // 2
    roi = image[cy - 28 // 2:cy + 28 // 2, cx - 28 // 2:cx + 28 // 2]

    # 调整图像大小
    roi = cv2.resize(roi, (28, 28), interpolation=cv2.INTER_AREA)

    # 归一化
    roi = roi.astype('float32') / 255

    # 展开成一维向量
    roi = np.reshape(roi, (1, 28, 28, 1))

    # 进行预测
    predictions = model.predict(roi)
    print(np.argmax(predictions[0]))

# 显示图像
cv2.imshow('Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上就是Python+OpenCV实现信用卡数字识别的方法详解,希望对你有所帮助。

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

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

相关文章

  • Python实现ATM简单功能的示例详解

    Python实现ATM简单功能的示例详解 ATM简单功能介绍 ATM(Automated Teller Machine)自动取款机是现代化金融服务的标志之一,为人们的生活和工作带来了便捷。下面我们以Python实现ATM简单功能为例来了解ATM自动取款机操作的基本过程。 ATM简单功能大致包括: 插卡操作:用户将银行卡插入ATM机中 输入密码:用户输入银行卡…

    python 2023年5月19日
    00
  • python定时关机小脚本

    现在我将为你详细讲解如何使用Python编写一个定时关机小脚本。 1. 获取权限 在Windows系统中,要执行关机命令需要管理员权限。因此,我们需要先获取管理员权限。具体方法为: 在开始菜单中找到“命令提示符”,右键点击并选择“以管理员身份运行”。 在弹出的UAC对话框中,点击“是”以获取管理员权限。 2. 编写Python脚本 Python脚本的内容包括…

    python 2023年5月23日
    00
  • Python统计列表中的重复项出现的次数的方法

    我来为您提供Python统计列表中重复项出现次数的方法攻略。 方法一:使用Python内置的Counter函数 使用Python的collections库中内置的Counter函数来完成统计操作。Counter函数可以将一个可迭代对象的各项元素出现次数统计出来,返回一个字典,字典键是元素,字典值是元素出现的次数。 示例代码: from collections…

    python 2023年6月3日
    00
  • Python机器学习算法之决策树算法的实现与优缺点

    Python机器学习算法之决策树算法的实现与优缺点 决策树算法是一种常用的机器学习算法,它可以用于分类和回归问题。在本文中,我们将详细讲解Python决策树算法的实现和优缺点,包括决策树的定义、决策树算法的实现示例说明等。 决树的定义 决策树是一种树形结构它可以用于分类和回归问题。在分类问题中,决策树将数据集分成多个类别,每个类别对应一个叶子节点。在回归问题…

    python 2023年5月14日
    00
  • Python+OpenCV实现角度测量的示例代码

    我们来详细讲解一下“Python+OpenCV实现角度测量的示例代码”的完整攻略。 简介 本攻略介绍如何使用Python和OpenCV来进行角度测量,包括了从照片中测量物体旋转角度和计算两个物体之间的旋转角度。 准备工作 首先,我们需要安装并配置好Python和OpenCV。可以参考以下步骤: 1.安装Python:可以从Python官网下载安装包进行安装。…

    python 2023年6月3日
    00
  • Python3 列表list合并的4种方法

    Python3列表list合并的4种方法 在Python中,可以使用多种方法将两个或多个列表合并成一个列表。本文将详细讲解Python3列表list合并的4种方法,包括使用加号(+)运算符、使用extend()方法、使用append()方法和使用列表解析。并提供两个实例说明。 加号(+)运算符 使用加号(+)运算符可以将两个列表合并成一个列表。例如: my_…

    python 2023年5月13日
    00
  • centos 自动运行python脚本和配置 Python 定时任务

    下面是 CentOS 中自动运行 Python 脚本和配置 Python 定时任务的完整攻略。 一、自动运行 Python 脚本 1.1 配置crontab CentOS5.x 系统自带cron服务,CentOS6.x及以上系统安装时默认安装此服务,具体安装方法为: sudo yum install cronie 安装完成后,启动cron服务 sudo sy…

    python 2023年5月19日
    00
  • python正则表达式匹配IP代码实例

    以下是“Python正则表达式匹配IP代码实例”的完整攻略: 一、问题描述 在Python中,我们可以使用正则表达式匹配IP地址。本文将详细讲解如何使用Python正则表达式匹配IP地址,并提供两个示例说明。 二、解决方案 2.1 使用正则表达式匹配IP地址 在Python中,我们可以使用正则表达式匹配IP地址。以下是一个示例,演示了如何使用Python正则…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部