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

yizhihongxing

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读取图片EXIF信息类库介绍和使用实例

    在本攻略中,我们将介绍Python读取图片EXIF信息类库介绍和使用实例。以下是一个完整攻略,包括两个示例。 步骤1:安装所需库 首先,需要安装所需的库。我们可以使用Pillow库来读取图片EXIF信息。 以下是示例代码,演示如何使用pip安装Pillow库: pip install Pillow 步骤2:读取图片EXIF信息 接下来,我们需要读取图片EXI…

    python 2023年5月15日
    00
  • 如何使用 Azure Python SDK 检查 VM 的磁盘大小?

    【问题标题】:How can I check the disk size of a VM with Azure Python SDK?如何使用 Azure Python SDK 检查 VM 的磁盘大小? 【发布时间】:2023-04-05 00:27:01 【问题描述】: 当我使用 Azure 创建 VM 时,例如标准 A6,它带有 2 个已安装的单元,一个…

    Python开发 2023年4月6日
    00
  • Python实现多任务进程示例

    这里是Python实现多任务进程示例的完整攻略。 1. 多任务进程简介 多任务进程可以同时运行多个程序,这些程序是相互独立的,互不干扰,可以充分利用计算机的资源。在Python中实现多任务进程有两种方式,分别是多进程和多线程。 2. 多进程实现多任务 2.1 创建进程 在Python中,可以通过multiprocessing模块来创建多个进程来实现多任务。下…

    python 2023年5月19日
    00
  • Python ElementTree 命名空间

    【问题标题】:Python ElementTree NamespacesPython ElementTree 命名空间 【发布时间】:2023-04-01 18:22:01 【问题描述】: 环境:蟒蛇 2.7视窗 8.1 示例 XML: <?xml version=”1.0″ encoding=”UTF-8″?> <edmx:Edmx xm…

    Python开发 2023年4月8日
    00
  • Python 遗传算法处理TSP问题详解

    Python 遗传算法处理TSP问题详解 简介 TSP(Traveling Salesman Problem)是指给定n个城市,求出一条路径,使得一名旅行商人从起点出发,途经每个城市恰好一次,最终回到起点,且路径长度最短。 遗传算法是一种通过模拟进化过程来进行优化问题求解的算法。在TSP问题中,使用遗传算法可以寻求出一条近似于最优解的路径。 解决步骤 初始化…

    python 2023年6月3日
    00
  • pip install 使用国内镜像的方法示例

    下面是“pip install使用国内镜像的方法示例”的完整攻略。 1. 为什么需要使用国内镜像 pip是Python的一个包管理工具,可以方便地安装、升级和删除Python包。但是pip默认从pypi.org下载包,这个网站的服务器位于海外,经常因网络和权限问题出现下载失败的情况,给开发带来不便。同时,由于国内网络环境的不同,从国外下载的速度也较慢。为此,…

    python 2023年5月14日
    00
  • Python实现鼠标自动在屏幕上随机移动功能

    Python实现鼠标自动在屏幕上随机移动功能的完整攻略 在本攻略中,我们将介绍如何使用Python实现鼠标自动在屏幕上随机移动的功能。我们将提供两个示例,演示如何使用pyautogui库和pynput库实现这个功能。 步骤1:安装必要的库 在开始之前,我们需要安装必要的库。我们可以使用以下命令来安装这些库: pip install pyautogui pyn…

    python 2023年5月15日
    00
  • 如何利用python 读取配置文件

    当我们开发一个程序时,通常需要读取外部的配置文件来配置一些程序的参数或者选项,这时就需要利用Python来读取配置文件。下面我来详细讲解如何利用Python读取配置文件的完整攻略。 第一步:导入模块 首先需要导入Python内置的configparser模块,用于读取配置文件。 import configparser 第二步:创建ConfigParser对象…

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