当前位置: 首页 > news >正文

OpenCV工业视觉进阶14|SQLite违规数据库存储+历史记录查询+Excel报表导出,完成项目商用数据闭环(验收必备)

前言

通过前13篇专栏连载,我们已经搭建完成一套界面美观、运行稳定、多路并发、实时预警的工业AI视觉检测系统,涵盖多线程稳流、多路RTSP并发、单窗口监控大屏、独立语音告警、分机位抓拍存证、断流自愈、EXE工控部署等全套核心能力。

但目前项目的数据存储方式仍为纯文本日志,存在明显商用短板:

  • txt日志杂乱无章,无法快速检索、筛选、统计

  • 无法按机位、时间、违规类型做数据汇总

  • 不能生成标准报表,项目验收、厂区台账归档不规范

  • 无历史记录回溯能力,不满足工业安防溯源要求

本篇作为商用项目最终闭环篇,新增工业项目标配的数据能力:轻量SQLite本地数据库存储、违规数据结构化录入、历史记录查询筛选、自动生成Excel报表导出。无需部署MySQL、无需服务器,单机离线即可运行,完美适配工控机离线部署场景,补齐项目最后一块商用短板。

一、技术方案选型(工业最优解)

1.1 数据库选型:SQLite

摒弃笨重的MySQL、PostgreSQL,选用SQLite轻量嵌入式数据库,完全适配工控机项目:

  • 无服务、零配置、单文件存储,开箱即用

  • 完全离线运行,无需联网、无需安装数据库环境

  • 支持事务写入,杜绝数据丢失、重复存储

  • 兼容EXE打包,工控机部署零依赖

1.2 报表工具选型:openpyxl

专门用于读写Excel表格,支持自定义表头、样式、数据填充,可自动生成标准化违规统计报表,适配项目验收、厂区安全台账归档需求。

二、环境依赖安装

pip install openpyxl

SQLite为Python内置库,无需额外安装,直接开箱即用。

三、数据库表结构设计(工业标准化)

设计通用违规记录表,适配所有机位、所有违规类型,字段完整、规范,便于后续查询统计:

  • id:主键自增ID(唯一数据标识)

  • cam_name:监控机位名称

  • warn_type:违规类型(安全帽/工装/裸露)

  • warn_time:违规精确时间

  • img_path:抓拍图片本地路径

  • create_date:数据录入日期(用于按日统计)

四、数据库工具类全局封装

封装数据库初始化、数据插入、历史查询、数据统计核心方法,线程安全写入,杜绝多机位并发写入报错。

import os import sqlite3 import threading from datetime import datetime # 数据库读写锁(解决多线程并发写入报错) DB_LOCK = threading.Lock() # 数据库文件路径 def get_db_path(): return os.path.join(ROOT_PATH, "violation_data.db") # 初始化数据库&数据表 def init_db(): db_path = get_db_path() with DB_LOCK: conn = sqlite3.connect(db_path) cur = conn.cursor() # 创建违规记录表 cur.execute(''' CREATE TABLE IF NOT EXISTS violation_record ( id INTEGER PRIMARY KEY AUTOINCREMENT, cam_name TEXT, warn_type TEXT, warn_time TEXT, img_path TEXT, create_date TEXT ) ''') conn.commit() conn.close() # 插入单条违规数据 def insert_violation_data(cam_name, warn_type, warn_time, img_path): create_date = datetime.now().strftime("%Y-%m-%d") db_path = get_db_path() with DB_LOCK: try: conn = sqlite3.connect(db_path) cur = conn.cursor() cur.execute( "INSERT INTO violation_record (cam_name,warn_type,warn_time,img_path,create_date) VALUES (?,?,?,?,?)", (cam_name, warn_type, warn_time, img_path, create_date) ) conn.commit() print(f"📊 数据入库成功:{cam_name} {warn_type}") except Exception as e: print(f"❌ 数据入库失败:{str(e)}") finally: conn.close() # 按日期查询历史记录 def query_record_by_date(date_str): db_path = get_db_path() res_list = [] with DB_LOCK: conn = sqlite3.connect(db_path) cur = conn.cursor() cur.execute("SELECT * FROM violation_record WHERE create_date=?", (date_str,)) res_list = cur.fetchall() conn.close() return res_list # 统计当日违规数量 def get_today_statistics(): today = datetime.now().strftime("%Y-%m-%d") records = query_record_by_date(today) stat_dict = { "总违规数": len(records), "no_hat": 0, "no_suit": 0, "bare_skin": 0 } for item in records: warn_type = item[2] if warn_type in stat_dict: stat_dict[warn_type] += 1 return stat_dict

五、Excel报表导出工具封装

支持按指定日期自动生成Excel报表,自定义表头、规整排版,自动保存至报表目录,可直接用于项目归档、安全检查。

from openpyxl import Workbook from openpyxl.styles import Font, Alignment # 违规类型中文映射 WARN_TYPE_MAP = { "no_hat": "未佩戴安全帽", "no_suit": "未穿戴工作服", "bare_skin": "皮肤裸露违规" } def export_excel_report(date_str=None): """ 导出指定日期的违规报表 :param date_str: 日期,默认今日 :return: 报表保存路径 """ if not date_str: date_str = datetime.now().strftime("%Y-%m-%d") records = query_record_by_date(date_str) if not records: print("ℹ️ 当前日期无违规数据,无需导出报表") return None # 创建报表保存目录 report_dir = os.path.join(ROOT_PATH, "report") os.makedirs(report_dir, exist_ok=True) report_path = os.path.join(report_dir, f"违规统计报表_{date_str}.xlsx") # 初始化工作簿 wb = Workbook() ws = wb.active ws.title = "违规记录统计" # 设置表头 headers = ["序号", "监控机位", "违规类型", "违规时间", "抓拍文件路径"] ws.append(headers) # 遍历写入数据 for idx, item in enumerate(records, 1): row_data = [ idx, item[1], WARN_TYPE_MAP.get(item[2], item[2]), item[3], item[4] ] ws.append(row_data) # 样式美化 for col in range(1, 6): cell = ws.cell(row=1, column=col) cell.font = Font(bold=True) cell.alignment = Alignment(horizontal="center", vertical="center") # 自适应列宽 ws.column_dimensions["A"].width = 8 ws.column_dimensions["B"].width = 20 ws.column_dimensions["C"].width = 18 ws.column_dimensions["D"].width = 22 ws.column_dimensions["E"].width = 45 wb.save(report_path) print(f"✅ 报表导出成功:{report_path}") return report_path

六、适配原有项目:数据自动入库改造

修改摄像头异步抓拍方法,在抓拍存图的同时自动结构化入库,无需手动操作,全程无感记录所有违规数据,完美兼容原有多线程、多路检测架构。

修改IndustrialCamera 类 async_save 方法

def async_save(self, frame, warn_type): now = time.time() if now - self.last_warn[warn_type] < 3: return self.last_warn[warn_type] = now save_dir = get_cam_save_dir(self.cam_name) fname = datetime.now().strftime("%H%M%S") + f"_{warn_type}.jpg" path = os.path.join(save_dir, fname) cv2.imwrite(path, frame) # 写入txt日志(保留原有功能) log_path = os.path.join(save_dir, "log.txt") warn_time = get_time_str() log = f"[{warn_time}] {self.cam_name} 违规:{warn_type} 文件:{fname}\n" with open(log_path,"a",encoding="utf-8") as f: f.write(log) # 新增:数据库自动入库 insert_violation_data( cam_name=self.cam_name, warn_type=warn_type, warn_time=warn_time, img_path=path ) print(f"✅ [{self.cam_name}] 抓拍+数据入库完成 {fname}")

七、初始化数据库(主函数新增)

在程序启动时初始化数据库,保证首次运行自动创建数据表,无需手动干预。

if __name__ == "__main__": # 初始化数据库 init_db() print("✅ 数据库初始化完成") model = YOLO(MODEL_PATH) cam_objs = [] # 初始化并启动所有摄像头线程 for cfg in CAM_LIST: cam = IndustrialCamera(cfg["name"], cfg["rtsp"]) cam_objs.append(cam) threading.Thread(target=cam.read_thread, daemon=True).start() threading.Thread(target=cam.infer_thread, args=(model,), daemon=True).start() print("✅ 工业监控大屏系统启动成功!") cv2.namedWindow("Industrial Super Monitor Screen", cv2.WINDOW_NORMAL) # 主循环渲染大屏 while not EXIT_FLAG.is_set(): big_screen = concat_grid_frames(cam_objs, 1920, 1080) cv2.imshow("Industrial Super Monitor Screen", big_screen) # 快捷键:按E导出今日报表 key = cv2.waitKey(1) & 0xFF if key == ord("e"): export_excel_report() if key == 27: EXIT_FLAG.set() break cv2.destroyAllWindows() executor.shutdown() print("✅ 系统安全退出,资源释放完成")

八、新增实用功能:快捷键报表导出

新增全局快捷键交互,运行系统时按下E键,即可一键导出当日所有违规数据Excel报表,实时归档、随时统计。

九、完整项目目录结构(商用规范)

project ├─ main.py # 主程序 ├─ best.onnx # 推理模型 ├─ violation_data.db # 全局违规数据库文件 ├─ warn_save # 分机位抓拍截图+日志 │ └─ 日期 │ ├─ cam1_车间作业区 │ ├─ cam2_出入口 │ └─ cam3_高空机位 └─ report # 自动生成Excel报表 └─ 违规统计报表_日期.xlsx

十、功能总结(项目终极闭环)

本篇完成了工业视觉项目最核心的商用数据能力收尾,至此整套系统彻底摆脱“玩具级demo”属性,完全达到商用验收标准:

  • 结构化数据存储:SQLite数据库稳定存储所有违规记录,支持永久溯源

  • 多线程安全写入:加锁处理,多路摄像头同时写入不报错、不丢数据

  • 一键Excel导出:标准化报表自动生成,适配厂区安全台账、项目验收

  • 数据统计查询:支持按日期筛选、违规类型统计,方便数据分析

  • 全离线运行:无需服务器、无需联网,工控机完美适配

  • 兼容全部旧功能:保留大屏展示、多线程并发、语音告警、断流重连、抓拍日志所有能力

十一、最终专栏完结预告

至此,OpenCV工业视觉全套实战专栏(1-14篇)正式完结

整套教程从零起步,依次完成:图像预处理 → YOLO推理训练 → ROI区域检测 → RTSP视频流 → 抓拍日志 → 语音声光告警 → 多线程性能优化 → 多路并发监控 → 单窗口大屏UI → 数据库数据存储 → Excel报表导出,实现算法+性能+界面+数据+部署全链路商用闭环。

后续可拓展高阶功能:Web后台可视化、远程设备管理、云端数据上报、用户权限登录、违规弹窗推送等,需要可以随时继续更新进阶番外篇!

http://www.jsqmd.com/news/1238523/

相关文章:

  • 跨平台资源下载解决方案:如何用res-downloader一站式解决全网视频下载难题
  • 第 2 篇:硬件抽象与 SPI 总线共享
  • VMware安装Windows 11全攻略:绕过TPM与性能优化
  • 系统规划与管理师-流程规划与执行核心知识点与应试指南
  • 如何解决 机械革命 蛟龙16Pro 触摸板失灵问题
  • MobaXterm中文版:Windows终极远程开发利器,快速解锁免费完整解决方案
  • Python数据分析驱动Unreal Engine虚拟场景:从数据到3D交互的实战指南
  • 一种 效果完美,并且绝对隐私安全的【身份证】抠像方式
  • Grok AI模型技术解析:从Transformer架构到企业级部署实践
  • Python3 注释编写完全指南:从基础规范到高效实践
  • DnCNN在时间序列去噪中的风险与改进方案
  • 基于MVC架构实现QQ邮箱验证码功能的技术方案
  • 超图神经网络过平滑问题:从扩散到反应-扩散的动力学分析
  • 基于BERT的对话状态跟踪:零样本学习与多领域适应性实践
  • Faiss向量搜索原理与NLP应用实践
  • 3分钟搞定Mac双系统驱动:Brigadier自动化工具完全指南
  • Minmea:嵌入式GPS解析库的终极选择,如何为微控制器提供高效NMEA 0183处理
  • C++俄罗斯方块项目实战:从架构设计到性能优化的完整指南
  • 零一万物IPO计划解析:AI公司技术产品化与上市准备路径
  • 告别科研绘图烦恼:100+机器学习可视化模板终极指南
  • 2026最强AI小说创作助手
  • OpenAI开源支持计划:ChatGPT Pro免费6个月申请指南
  • C++ this指针原理与应用全解析
  • 小红书内容下载终极指南:XHS-Downloader完整使用教程与技巧分享
  • Mapbox Studio完整指南:5分钟创建专业级自定义地图的终极方案
  • 2026国内EMBA偏向哪些行业|中立择校测评
  • 零代码平台与国产AI模型结合的产品验证实战指南
  • 京东抢购神器JDspyder:告别手动秒杀,轻松抢到茅台等热门商品
  • 【AI提示词工程黄金法则】:3步生成专业级流程图,92%的工程师都忽略了第2步?
  • Windows系统文件dxmasf.dll丢失找不到问题解决