记录分享物联网数据处理技术课程的期末大作业
一、研究背景
在当前信息时代,图书馆作为知识储备和信息资源中心,其地位与重要性持续扩展。然而,传统的图书馆管理方式面临着一系列挑战,包括书籍盗窃和管理效率低下等问题。为解决这些困境并提高管理效率,本项目旨在构建一个以物联网技术和python
语言为基础的智能图书馆借阅管理系统。
尽管物联网技术在图书馆智能化方面提供了重要支持,但也存在着智能感知设备需求量大、
服务质量不稳定等
问题。目前存在的研究总结到目前大多数的图书馆存在管理操作不完善、信息孤岛现象严重的问题。在实际的图书管理操作过程中,由于部分图书馆管理人员的服务观念较为陈旧,日常管理工作仍以人工管理为主,导致图书馆业务无法进行集中式操作,进而财务管理工作上出现较大的问题,甚至浪费图书馆的人力资源、物力资源和财力资源,阻碍图书馆管理效率的提升;其次,图书馆管理系统中信息孤岛现象严重,即虽然图书馆管理系统在不断优化和扩张,并且在不断增加子系统,但是这些子系统未能完全涵盖图书馆的实际管理工作和管理业务,导致每个子系统呈现出孤立性,未能实现有效联系,无法为借阅者提供高品质的借阅服务。
本系统的目标在于提供一个智能化、高效的图书馆借阅管理解决方案,具体项目研究目标如下:
(
1
)实现图书借阅自动化:通过图像识别技术自动辨识书籍信息,简化借阅流程。通过对书籍封底 ISBN
码(
International Standard Book Number
,国际标准书号)的识别,实现书籍的实时查询与选定,方便读者进行借书还书的操作以及管理者可快速录入数据。
(
2
)提高管理效率与安全性:降低人工操作,减少书籍丢失和盗窃的风险;减少对标识硬件的依赖性,提高数据交互的稳定性。
(
3
)提升用户体验:改善读者借阅过程,提高借阅速度和管理便捷性。
二、开发环境介绍
语言环境:Python
数据库:Mysql
开发工具:VScode
三、系统架构
四、系统实现与测试
(1)图像采集模块:
负责确保摄像头以适当的设置捕捉图书图像,保证图像质量和清晰度,以便后续处理和识别带有图书信息的图像数据。
(2)图像处理模块:
使用
OpenCV
库,对从图像采集模块获取的图像数据进行各种处理。这包括预处理步骤(如降噪、灰度化、二值化等)、图像旋转以适应可能的倾斜,以及边缘检测等操作。该模块通过 OpenCV
提供的功能,优化图像以便图像识别模块更好地识别图书信息。
ISBN
码数据集
ISBN
码样本模板集
首先需要对ISBN码数据集做以下图像处理:
(
1
)读取图像并调整大小:
cv2.imread(test_img_fn[index])
读取测试图像,然后将其宽度调整为 700
像素。
(
2
)显示原始图像:
plt.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
,可视化和检查原始图像的外观和内容。
(
3
)灰度转换:
cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
将原始图像转换为灰度图像。灰度图像用于简化图像处理,并且后续的识别算法对灰度图像有更好的适应性。
(
4
)去噪处理 :
processed_gray = denoising(gray1, processed_gray)
使用denoising()函数对灰度图像进行去噪处理。
(
5
)二值化:
bin_img = to_binary_graph(gray1)
将灰度图像转换为二值图像。
处理后结果如下图所示:
再分割 ISBN 所在行:通过 split_col()函数将二值图像中的字符进行分割,并识别出每个字符。
def split_col(bin_img2):
the_col = [0] * bin_img2.shape[1]
for i in range(bin_img2.shape[0]):
for j in range(bin_img2.shape[1]):
if bin_img2[i, j] != 0:
the_col[j] += 1
a = [] num = 0
for j in range(bin_img2.shape[1]):
if the_col[j] >= 3 and num % 2 == 0:
num += 1
left_bound = j
j += 2
elif the_col[j] == 0 and num % 2 != 0:
num += 1
right_bound = j
a.append((left_bound, right_bound))
j += 2
return a
(3)图像识别模块:
负责对图像处理模块优化过的图像进行识别,利用模板匹配等技术,识别图像中的书籍信息,如 ISBN 号码或其他相关信息。它分析经过处理的图像,并尝试将其与预先存储的模板进行匹配,从而识别出图书的相关信息。
通过
recognition()
函数对分割出的每个字符图像进行模板比对识别。
def recognition(input_img):
sample_img_path = "D:\Desktop\sample\*"
sample_img_FN = glob.glob(sample_img_path)
sample_img_nums = len(sample_img_FN)
min_diff = float('inf')
recognized_char = ''
for img_path in sample_img_FN:
num_img = cv2.imread(img_path, 0)
num_img = cv2.resize(num_img, (40, 60))
input_img = cv2.resize(input_img, (40, 60))
diff = np.sum(cv2.absdiff(input_img, num_img))
if diff < min_diff:
min_diff = diff
recognized_char = img_path[len(sample_img_path) - 1]
return recognized_char
字符分割图
(4)数据库管理模块:
负责与MySQL数据库交互,并处理存储和管理书籍信息、借阅记录等数据。当图像识别模块识别出图书信息后,该模块将相关信息存储到数据库中,并能根据用户的查询需求从数据库中检索信息,如书籍详情或借阅记录等。
主要设计流程如下:
创建数据库连接:通过
mysql.connector.connect()
建立与
MySQL
数据库的连接,以便后续对数据库进行操作。
创建游标对象:使用
db.cursor()
创建一个游标对象,该对象允许在数据库中执行SQL语
句。
创建
book
表:使用
CREATE TABLE IF NOT EXISTS
语句创建名为
book的表格。该表格有两个字段:id
(自增主键)和
ISBN
(唯一且不能为空的
ISBN码字段)。
import mysql.connector
db = mysql.connector.connect(
host="localhost", user="root", password="030303", database="book" )
cursor = db.cursor()
create_table_query = """
CREATE TABLE IF NOT EXISTS book (
id INT AUTO_INCREMENT PRIMARY KEY, isbn VARCHAR(20) UNIQUE NOT NULL
)"""
cursor.execute(create_table_query)
cursor.close()
db.close()
def add_isbn_to_database(isbn):
db = mysql.connector.connect(
host="localhost", user="root", password="******", database="book")
cursor = db.cursor()
insert_query = "INSERT INTO book (isbn) VALUES (%s)"
cursor.execute(insert_query, (isbn,))
db.commit()
cursor.close()
db.close()
“
book
”数据表信息
(5)用户界面模块:
提供一个直观友好的用户界面,方便用户与系统交互。该模块允许用户输入图书信息或进行查询,浏览图书库存或借阅记录,并提供相应的反馈和结果。
根据以上用户借阅图书流程的说明,用户打开查询页面,通过摄像头捕捉书籍图像后,系统会自动进行书籍信息的识别,并提醒用户书籍是否被借出、输入借阅者姓名并实时更新借阅时间。具体实现的结果如下:
对应代码如下:
def borrow_book(isbn_number):
cursor = db.cursor()
check_book_query = "SELECT * FROM book WHERE isbn = %s"
cursor.execute(check_book_query, (isbn_number,))
book_exists = cursor.fetchone()
if book_exists:
print("书籍已找到!")
borrow_choice = input("是否需要借阅该书籍?(y/n): ")
if borrow_choice.lower() == 'y':
borrower_name = input("请输入借阅者姓名: ")
print('请输入借阅者姓名:',borrower_name)
# 获取当前日期时间
current_date_time = datetime.datetime.now()
borrow_date = current_date_time.strftime('%Y-%m-%d %H:%M:%S')
insert_query = "INSERT INTO borrow_records (isbn, borrower_name, borrow_date)VALUES (%s, %s, %s)" borrow_data = (isbn_number, borrower_name, borrow_date)
cursor.execute(insert_query, borrow_data)
db.commit()
print("借阅记录已更新!")
else:
print("未找到该书籍,请检查 ISBN 码是否正确。")
cursor.close()
db.close()
borrow_book()
总而言之,以上期末项目虽还无法实际应用,但还是很好地训练和巩固了本人对于OpenCV库和搭建MySQL数据库的知识,以上代码非完整代码但所展示的模块代码经测试都可直接运行。