用Python 和 OpenCV 实现火车票的信息提取

档案电子化已经是大势所趋,而财务档案中的火车票自动识别是一个长期被关注的问题。下面给出一个提取中国火车票上的基本信息的算法的流程:

  1. 图像识别:使用图像识别技术识别火车票上的文字信息。

  1. 文字识别:对图像识别得到的文字信息进行识别,提取火车票上的基本信息。

  1. 数据处理:对提取出的信息进行整理和格式化,得到清晰明了的信息。

  1. 数据存储:将处理好的信息存储到数据库或者文件中,以便日后查询和使用。

  1. 数据分析:对存储的信息进行分析,统计火车票的相关数据,如乘车人数、乘车路线等。

  1. 数据展示:将分析出的数据以图表、表格等形式展示出来,方便用户查看和使用。

下面,给出这个算法的实现。

  1. 图像识别

下面是一个基于Python 和 OpenCV 的简单图像识别代码示例:

import cv2

# 读取图片
img = cv2.imread("image.jpg")

# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用阈值处理,使图片二值化
_, threshold = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)

# 寻找图片轮廓
contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 在原图上绘制轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)

# 显示图片
cv2.imshow("Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

该代码使用了 OpenCV 的图像处理函数,包括读取图片、转换为灰度图、二值化、寻找轮廓等。最终,它在原图上绘制出轮廓,并显示结果图像。

  1. 文字识别

下面是一个使用 Python 和 OpenCV 实现文字识别的代码示例:

import cv2
import pytesseract

# Load the image and convert it to grayscale
image = cv2.imread("image.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Apply Otsu's thresholding to the grayscale image
threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Pass the thresholded image to the Tesseract OCR engine
text = pytesseract.image_to_string(threshold)

print(text)
  1. 数据处理

数据处理的代码将根据您的需求而不同,但是我们可以使用 Python 的字符串操作和正则表达式等功能进行一些基本的处理。

下面是一个简单的示例,它从识别的文本中提取出火车票号码:

import re

text = "Ticket No.: 12345678 Train No.: G1234 Departure: Beijing Arrival: Shanghai"

# Use regular expression to extract the ticket number
ticket_number = re.search(r"Ticket No.: (\d+)", text).group(1)

print("Ticket Number:", ticket_number)

这段代码使用了正则表达式中的 search 函数,从识别的文本中匹配出 "Ticket No.: 12345678" 的模式。然后使用 group 函数从匹配的字符串中提取出票号码。

根据您需要的数据结构,可以使用其他技术(如字符串分割,字典等)来处理文本数据。

提取出发站、到站、车次、时间、票价、乘车人信息需要使用 Optical Character Recognition(OCR)技术识别图像中的文字,然后使用数据抽取技术对识别出的文字进行数据处理。具体代码实现取决于使用的语言和技术栈。下面是一个用 Python 实现的示例:

import pytesseract
import cv2

def extract_ticket_info(image_path):
    # 使用pytesseract库识别图像中的文字
    text = pytesseract.image_to_string(cv2.imread(image_path))
    
    # 利用正则表达式提取信息
    import re
    pattern = re.compile(r'出发站:(.*?)\n到达站:(.*?)\n车次:(.*?)\n时间:(.*?)\n票价:(.*?)\n乘车人:(.*?)\n')
    match = re.search(pattern, text)
    
    if match:
        departure_station = match.group(1)
        arrival_station = match.group(2)
        train_number = match.group(3)
        time = match.group(4)
        price = match.group(5)
        passenger = match.group(6)
        
        return {
            '出发站': departure_station,
            '到达站': arrival_station,
            '车次': train_number,
            '时间': time,
            '票价': price,
            '乘车人': passenger
        }
    else:
        return None

实际上,上述给出的代码更适合提取登机牌的信息,因为国内的火车票上都是直接显示信息,而没有栏目名称。

中国火车票的信息布局是固定的,所以我们可以根据图像识别出的文字所在位置来确定它们的信息类型,再根据预定义的信息模板对文字进行解析和整理。

import cv2
import pytesseract

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

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

# 使用pytesseract识别图像中的文字
text = pytesseract.image_to_string(gray, lang='chi_sim')

# 解析出发站、到站、车次、时间、票价、乘车人信息
# 解析代码省略

# 输出信息
print('出发站:', departure_station)
print('到站:', arrival_station)
print('车次:', train_number)
print('时间:', time)
print('票价:', price)
print('乘车人:', passenger)
  1. 数据存储

下面是一个使用PHP的代码示例,该代码将识别到的火车票信息插入到 MySQL 数据库中。

<?php

// 连接到 MySQL 数据库
$conn = mysqli_connect('localhost', 'username', 'password', 'database_name');

// 获取识别到的火车票信息
$departure_station = 'Beijing';
$arrival_station = 'Shanghai';
$train_number = 'G123';
$time = '10:00';
$price = '100';
$passenger = 'John Doe';

// 构造 SQL 插入语句
$sql = "INSERT INTO train_tickets (departure_station, arrival_station, train_number, time, price, passenger)
VALUES ('$departure_station', '$arrival_station', '$train_number', '$time', '$price', '$passenger')";

// 执行 SQL 语句
if (mysqli_query($conn, $sql)) {
    echo "新记录插入成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

// 关闭数据库连接
mysqli_close($conn);

?>

5.数据分析

下面是一个用 Python 进行数据分析的代码示例:

import pandas as pd

# 读取数据
data = pd.read_csv("train_data.csv")

# 查看前 5 行数据
print(data.head())

# 统计乘车人数据的基本统计量,包括平均数、标准差、最大值等
print(data["passenger_count"].describe())

# 绘制乘车人数的直方图
data["passenger_count"].plot.hist()

# 按照出发时间进行分组,统计每组的乘车人数的均值
grouped = data.groupby("departure_time")["passenger_count"].mean()
print(grouped)

# 绘制乘车人数的折线图,按照出发时间分组
grouped.plot()

这是一个简单的数据分析代码示例,使用了 pandas 库进行数据处理。在读取数据之后,我们对数据进行了描述性统计,绘制了直方图和折线图。根据实际需求,可以继续添加更多的数据分析代码。

6.数据展示

数据展示的代码可以通过不同的图表进行展示,以下是一个使用 PHP 和 Matplotlib 进行数据展示的代码示例:

<?php
// 需要先安装 matplotlib-php 扩展
require_once 'matplotlib/matplotlib.inc.php';

use matplotlib\pylab;

// 从数据库中读取数据
$conn = mysqli_connect("localhost", "root", "", "train_ticket");
$query = "SELECT departure_station, arrival_station, ticket_price FROM train_ticket_data";
$result = mysqli_query($conn, $query);

// 准备数据
$departure_stations = [];
$arrival_stations = [];
$ticket_prices = [];
while ($row = mysqli_fetch_array($result)) {
    array_push($departure_stations, $row["departure_station"]);
    array_push($arrival_stations, $row["arrival_station"]);
    array_push($ticket_prices, $row["ticket_price"]);
}

// 绘制条形图
pylab::clf();
pylab::bar(array_combine($departure_stations, $ticket_prices), width=0.5, align='center');
pylab::xlabel("Departure Station");
pylab::ylabel("Ticket Price");
pylab::title("Train Ticket Price by Departure Station");
pylab::grid(true);
pylab::savefig("train_ticket_price.png");

// 展示图片
header("Content-type: image/png");
readfile("train_ticket_price.png");

上面的代码将从数据库中读取出发站、到站和票价信息,然后使用 Matplotlib 绘制条形图并展示出来。请注意,在运行代码之前需要先安装 matplotlib-php 扩展。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python是一种功能强大的编程语言,在计算机视觉领域广泛应用。OpenCV是一个开源的计算机视觉库,提供了许多处理图像和视频的函数和方法。SIFT是一种常用的特征提取算法,可以在图像中检测出关键点,并生成特征向量。在这里,我们将介绍如何使用Python结合OpenCV实现SIFT特征提取与匹配。 使用Python实现SIFT特征提取的基本步骤如下: 1. 导入OpenCV库并读取图像 ``` import cv2 img = cv2.imread('image.jpg') ``` 2. 创建SIFT对象并检测关键点 ``` sift = cv2.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(img, None) ``` 通过使用SIFT对象的detectAndCompute()函数,我们可以对图像进行关键点检测和特征描述符提取,并将结果保存在两个变量kp和des中。 3. 可视化关键点并保存图像 ``` img_kp = cv2.drawKeypoints(img, kp, None) cv2.imshow('Keypoints', img_kp) cv2.imwrite('output.jpg', img_kp) cv2.waitKey() ``` 在这个步骤中,我们使用drawKeypoints()函数将检测到的关键点绘制在图像上,并可以通过imshow()函数显示图像。然后,我们可以使用imwrite()函数将图像保存到本地。 实现SIFT特征匹配的基本步骤如下: 1. 读取并检测两张图像的关键点和描述符 ``` import cv2 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) ``` 2. 创建并运行暴力匹配器 ``` bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) ``` 3. 使用比值测试来筛选出良好的匹配 ``` good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append([m]) ``` 4. 可视化匹配点并保存图像 ``` img_matched = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good_matches, None, flags=2) cv2.imshow('Matching result', img_matched) cv2.imwrite('output.jpg', img_matched) cv2.waitKey() ``` 在步骤2中,我们使用了暴力匹配器BFMatcher()来对特征描述符进行匹配。knnMatch()函数返回的是最近邻和次近邻的描述符距离,我们可以用比值测试筛选出距离最近的描述符,并将其作为好的匹配。最后,我们使用drawMatchesKnn()可以将匹配点绘制在图像上,并通过imshow()函数显示图像。最后,我们可以通过imwrite()函数保存图像。 综上所述,使用Python结合OpenCV实现SIFT特征提取和匹配非常简单。利用OpenCV中的函数和方法,我们可以轻松地处理图像和视频,实现各种计算机视觉应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evaporator Core

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值