【python】核酸检测项目之查询数据库获取对应的图片进行识别再返回给数据库
前言
本文主要讨论python中对数据库及文件操作的一些方法,关于图像处理的方法及ocr文字识别网上已有较多且详细的资料,本小白就不在此班门弄斧了,本文所涉及的主要步骤是从数据库中获取所需要的文件名再从指定文件夹中找出,进行文字识别最后再将数据返回给数据库中对应的表里。(小白也能看懂哦!)
环境配置
本文用PyCharm来写所需的库为
- import os
- import pytesseract as ts
- import re
- import cv2
- import pymysql
一、python连接数据库(大佬略过)
先尝试下连接数据库吧
host = 'wxXX.XXXXX.XX' # 本地用loaclhost就行
username = 'root'
passwd = '123XXXXX'
dbname = 'dbXXXX'
port = 3XXX
# 连接数据库
try:
db = pymysql.connect(host=host, user=username, passwd=passwd, port=port, db=dbname)
print("数据库成功连接!")
except pymysql.Error as e:
print("数据库连接失败: " + str(e))
二、从数据库中获取所需要的文件名
从img表中获取guid_img这一列的值
放核酸检测图片的文件夹
<------------------------------------------------------------------------->
directory_name = r"D:\jsj\python\Jdpyter-notebook\see\hsimages" # 核酸检测图片——文件夹路径(全局变量)
#连接数据库
db = pymysql.connect(host=host, user=username, passwd=passwd, port=port, db=dbname)
cur = db.cursor()
# 从img表中获取guid_img这一列的值
sqlQuery = "SELECT guid_img FROM img"
print("数据库成功连接!")
try:
cur.execute(sqlQuery) # 执行sqlQuery
search_num = cur.fetchall() # 获取所需的图片文件名
for row in search_num: #遍历search_num
search = row[0] + '.png' # 加上文件后缀名
# os.listdir()遍历文件夹
for filename in os.listdir(directory_name):
if search == filename: # 条件
print(os.path.join(filename), search)
directory_name1 = directory_name + r'/' + filename # 将图片路径补充完整
print("图片地址为", directory_name1)
Identify(directory_name1) # 调用图像识别的函数(见,三、OCR文字识别)
except pymysql.Error as e:
print("数据查询失败:" + str(e))
三、OCR文字识别并将结果返回给数据库
所识别的图片
本文采用的主要是tesseract OCR进行文字识别,识别图像为行程码,识别后返回的主要有三个值 颜色:‘绿色行程卡’ ,时间:‘2022.10.03 18:23:52’,地点:‘江苏省苏州市’ ;以下为识别图像的代码。(关于tesseract OCR的下载安装等相关知识还请动动手指去查查资料啦)
数据返回给数据库
# 此处的directory_name1为上文文获取的图片路径
def Identify(directory_name1):
# define a threshold, 128 is the middle of black and white in grey scale
lang = 'chi_sim'
# read image
img = cv2.imread(directory_name1, cv2.IMREAD_GRAYSCALE)
text = ts.image_to_string(img, lang)
# print(text)
def check_chinese(check_alpha): # 判断是否是中文
if u'\u4e00' <= check_alpha <= u'\u9fa5':
return True
else:
return False
def deal(ls):
try:
return ''.join([e for e in ls[0] if e != ' ' and check_chinese(e)])
except Exception as e:
print(e)
# 正则表达式提取需要的信息
xcm_color = deal(re.findall(r"请 收 下 (.*)", text))
xcm_upload_time = re.findall(r"更 新 于 : (.*)", text)
xcm_tj = deal(re.findall(r"到 达 或 途 经 (.*)", text))
print(xcm_color)
print(xcm_upload_time[0])
print(xcm_tj)
识别结果返回给数据库对应的表中(以下代码依旧包含在def Identify 中)
# 连接数据库
try:
db = pymysql.connect(host=host, user=username, passwd=passwd, port=port, db=dbname)
cur = db.cursor()
print("数据库成功连接!")
sql = 'INSERT INTO xcm(xcm_color, xcm_upload_time, xcm_tj) VALUE (%s,%s,%s)'
print(search_num)
for row in search_num:
search1 = row[0]
print(search1)
# 注意: 字段用``包含,时间xcm_upload_time需要加上[0]; 此处为修改xcm表中xcm_color, xcm_upload_time, xcm_tj的值且该列guid_xcm的值需等于search1
sql_update = "UPDATE xcm SET `xcm_color` = '%s' ,`xcm_upload_time` = '%s', `xcm_tj` = '%s' WHERE `guid_xcm` = '%s'; " % (xcm_color, xcm_upload_time[0],xcm_tj, search1)
cur.execute(sql_update)
db.commit()
print("数据插入成功!")
except pymysql.Error as e:
print("数据库插入失败: " + str(e))
db.rollback()
db.close()
可能报错信息:数据库插入失败: (1064, “You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘xcm_upload_time
= ‘2022.10.03 18:23:52’, xcm_tj
= ‘江苏省苏州市’ WH…’ at line 1”)
这里通常是因为:sql_update = "UPDATE xcm SET xcm_color
= ‘%s’ ,xcm_upload_time
= ‘%s’, xcm_tj
= ‘%s’ WHERE guid_xcm
= ‘%s’; " 这里的逗号,空格出错或者前面的所需的数据与后面 “ % (xcm_color, xcm_upload_time[0], xcm_tj, search1) ” 给的值不匹配
结果
运行结果
总结
求点赞,求收藏!爱你
(有不懂的可以私信我,我会在文章中进行补充)
以上就是本文的主要内容,有错误请各位大佬指正。