前篇: 【PyTorch + PyQt + 网络爬虫】—> 基于resnet34的中草药识别
前言:基于之前的QT页面识别改善,取消了QT界面,添加实时视频读取以及数据库录入。
实时视频
- 原理:使用OpenCV打开摄像头,以3秒间隔的一帧截取一张图片,因为本项目是流水线形式的识别,且摄像头机位固定,故而可采取该形式获取标准格式的图片。
# 设置视频源,这里使用摄像头0
cap = cv2.VideoCapture(0)
# 检查是否成功打开视频源
if not cap.isOpened():
print("Error opening video stream or file")
exit()
# 设置保存图片的文件夹路径
output_folder = 'data/test_1'
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 设置开始时间和下一次保存图片的时间
start_time = time.time()
next_save_time = start_time + 3 # 初始设置为3秒后保存
try:
while True:
# 读取一帧
ret, frame = cap.read()
if not ret:
print("无法接收帧(流结束)退出 ...")
break
# 检查是否到了保存图片的时间
current_time = time.time()
if current_time >= next_save_time:
# 构建图片保存路径和文件名
timestamp = time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime(current_time))
filename = os.path.join(output_folder, f'{timestamp}.jpg')
# 保存图片
cv2.imwrite(filename, frame)
print(f"Saved frame to {filename}")
# 计算下一次保存图片的时间
next_save_time = current_time + 3
cv2.imshow('Video', frame)
# 等待按键,如果按下'q'键,则退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
# 释放资源
cap.release()
cv2.destroyAllWindows()
识别
- 识别部分基本和上篇一样,删除了QT页面部分,添加了读取图片名的函数。
# 图片名读取(识别时间)
def get_image_files(directory, extensions=['.jpg', '.jpeg', '.png']):
image_filenames_without_extension = []
for root, dirs, files in os.walk(directory):
for file in files:
extension = os.path.splitext(file)[1].lower()
if extension in extensions:
# 使用os.path.splitext来分割文件名和后缀名,并只取第一部分(文件名)
filename_without_extension = os.path.splitext(file)[0]
# 只添加不带后缀名的文件名到列表中
image_filenames_without_extension.append(filename_without_extension)
return image_filenames_without_extension
image_file = get_image_files('data/test_1')
数据库录入
- 使用python语句对数据库操作,navicat进行查看。录入三个数据(识别时间即图片名、药材名称、识别率)进database.db的recognition_data表中。
# 连接到SQLite数据库
conn = sqlite3.connect('database.db')
# 创建一个Cursor对象
cursor = conn.cursor()
# 插入信息的SQL语句
insert_data_sql = '''
INSERT INTO recognition_data (time, name, recognition_rate) VALUES (?, ?, ?)
'''
# 录入信息的示例数据
recognition_data = []
# 使用for循环将数据读入recognition_data列表
for image_files, pred_index, formatted_string in zip(image_file, pred_index_base, formatted_string_base):
recognition_data.append((image_files, pred_index, formatted_string))
# 执行插入操作
cursor.executemany(insert_data_sql, recognition_data)
# 提交事务
conn.commit()
# 输出插入的数据数量
print(f"Inserted {cursor.rowcount} rows of data.")
# 关闭Cursor和Connection
cursor.close()
conn.close()
- 然后使用navicat查看
项目总结
- 完善了前篇的不足,通过简单的原理与语句实现功能。