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

QT C++ AI茶叶智能解块工上位机(信创完整版)

# QT C++ AI茶叶智能解块工上位机(信创完整版)
## 项目名称
AI茶叶全自动解块筛分流水线控制系统(适配红茶/绿茶/黄茶/普洱;银河麒麟/统信UOS;Qt5/Qt6 C++11)
## 茶叶解块工艺国标/加工规程依据
执行标准:T/ZCTIA 0009-2025红茶加工规程、绿茶连续化生产线通用工艺、普洱茶初制加工规范
### 一、四大茶类解块核心工艺参数(系统自适应切换)
揉捻后茶叶粘性结块,必须打散分离茶团,防止发酵不均、碎茶过多、条索断碎;区分嫩叶/老叶、红/绿/普洱独立参数:

| 茶类 | 解块滚筒转速(r/min) | 振动筛频率(次/min) | 热风温控(℃) | 标准解块时长(min) | 碎茶容忍上限 |
|------|---------------------|--------------------|-------------|-------------------|--------------|
| 红茶(小叶种) | 180–220 | 270–280 | 36–39 | 3–5 | ≤6% |
| 绿茶(嫩芽) | 120–160 | 240–260 | 常温冷风 | 2–4 | ≤4% |
| 黄茶/大叶绿茶 | 160–190 | 250–270 | 30–35 | 4–6 | ≤7% |
| 普洱晒青毛茶 | 220–260 | 280–300 | 40–45 | 5–8 | ≤9% |

### 二、AI视觉判定结块等级(实时动态调速)
1. **轻度结块**:少量小茶团,滚筒低速、低振动,减少碎茶
2. **中度结块**:标准揉捻成团,标准转速/振动参数
3. **重度结块**:大面积粘团、湿茶粘连,自动提升转速+热风辅助打散
4. **过碎预警**:视觉识别碎末超标,立即降速、减小振动频率自锁保护条索

### 三、全自动流水线完整作业流程
爬坡均料输送机上料 → 光电料位监测均匀布料 → 双级滚筒齿辊解块打散 → 环形3D工业相机扫描茶团状态 → YOLO分割识别结块大小、碎末占比、茶条完整度 → AI匹配茶类工艺输出滚筒转速、振动频率、热风温度、输送速度 → 多级分层振动筛分(成品茶/碎茶/茶末分通道出料)→ 重量计量统计、生产台账入库,全程可追溯。

## 系统核心功能
1. **多传感器实时采集**:进料料位光电、滚筒转速编码器、振动频率反馈、热风温湿度、出料重量传感器、碎茶筛分流量传感器、电机负载电流
2. **YOLO茶叶结块视觉模型**:识别茶团尺寸、粘连程度、碎末占比、完整条索占比,实时反馈结块等级动态调参
3. **AI解块工艺决策算法**:融合茶叶品类、原料老嫩、温湿度、结块程度、碎茶占比,自动输出全套设备运行参数,防止过碎和解块不充分
4. **全套流水线机构控制**:均料输送变频调速、双级解块滚筒伺服驱动、热风风机温控、多级振动筛激振调节、三路分料出料电磁阀、整机急停、电机过载/高温自锁报警
5. **双运行模式**:单机机构手动点动调试、整条流水线全自动连续解块筛分
6. **溯源生产台账**:SQLite存储每小时处理总重量、成品茶产量、碎茶/茶末产出、平均结块等级、碎茶率,一键导出CSV标准化茶叶加工档案
7. **国产化信创适配**:中文界面、深浅双主题,飞腾/龙芯ARM工控稳定运行,无闭源商业组件
8. **多线程解耦架构**:传感器采集、视觉推理、运动控制三线程隔离,24h制茶车间连续运行UI无卡顿

## 工程目录
```
TeaDeBlock/
├─ TeaDeBlock.pro
├─ main.cpp
├─ mainwindow.h / mainwindow.cpp
├─ sensorthread.h / sensorthread.cpp # 料位、转速、温湿度、重量传感采集
├─ deblockctrl.h / deblockctrl.cpp # 输送、解块滚筒、振动筛、热风整机控制
├─ datamgr.h / datamgr.cpp # SQLite数据库、解块台账CSV导出
├─ aideblocklogic.h / aideblocklogic.cpp# AI结块分级+工艺参数决策算法
├─ visionthread.h / visionthread.cpp # YOLO茶团结块、碎茶识别线程
└─ mainwindow.ui
```

# 完整可编译源码
## 1. TeaDeBlock.pro 信创工程配置
```pro
QT += core gui widgets serialport charts sql multimedia opengl
greaterThan(QT_MAJOR_VERSION,4): QT += widgets
CONFIG += c++11 warn_on

# 国产银河麒麟/统信 OpenCV4 路径
INCLUDEPATH += /usr/local/include/opencv4
LIBS += -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_dnn -lopencv_highgui -lopencv_imgcodecs -lopencv_calib3d

# Windows编译注释上方,启用下方
#INCLUDEPATH += D:/opencv/build/include
#LIBS += -LD:/opencv/build/x64/vc16/lib -lopencv_world480

# 编译输出目录
DESTDIR = bin
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj

SOURCES += main.cpp\
mainwindow.cpp \
sensorthread.cpp \
deblockctrl.cpp \
datamgr.cpp \
aideblocklogic.cpp \
visionthread.cpp

HEADERS += mainwindow.h \
sensorthread.h \
deblockctrl.h \
datamgr.h \
aideblocklogic.h \
visionthread.h

FORMS += mainwindow.ui

# 信创项目标识
VERSION = 1.0.0
QMAKE_TARGET_COMPANY = 国产智能茶叶加工实验室
QMAKE_TARGET_PRODUCT = AI茶叶全自动解块筛分流水线控制系统
QMAKE_TARGET_COPYRIGHT = Copyright 2026 红/绿/普洱标准化解块专用
```

## 2. datamgr.h 解块筛分台账数据管理
```cpp
#ifndef DATAMGR_H
#define DATAMGR_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDateTime>
#include <QList>

// 解块流水线实时传感数据
struct DeBlockSensorData{
QDateTime time;
double feedTonnage; //进料瞬时流量 kg/h
int rollerRpm; //解块滚筒转速 rpm
int vibrateFreq; //振动筛频率 次/min
double hotAirTemp; //热风温度 ℃
double airHumi; //风道湿度 %
double finishedWeight; //成品茶瞬时出料 kg
double brokenRate; //实时碎茶率 %
int motorLoad; //滚筒电机负载 0~100%
};

// 茶叶品类枚举
enum TeaVar{
VAR_BLACKTEA=0, //小叶红茶
VAR_GREENTEA=1, //嫩芽绿茶
VAR_YELLOWTEA=2, //黄茶/大叶绿茶
VAR_PUERRAW=3 //普洱晒青毛茶
};

// 结块缺陷等级
enum BlockLevel{
BLOCK_LIGHT=0, //轻度结块
BLOCK_MID=1, //中度结块
BLOCK_HEAVY=2, //重度粘团
BLOCK_OVERBROKEN=3 //碎茶超标预警
};

// AI视觉识别单批次茶料结果
struct TeaBlockDetectRes{
QDateTime time;
int teaVar;
int blockLevel;
double avgBlockSize; //平均茶团尺寸 mm
double brokenPercent; //碎末占比 %
double stripComplete; //完整条索占比 %
QString snapPath; //茶料抓拍原图路径
};

// 单班次解块作业台账
struct DeBlockWorkLog{
QDateTime startTime;
QDateTime endTime;
int teaVar;
double totalInputTon; //总进料吨位
double totalFinishedTon; //成品茶产量
double totalBrokenTon; //碎茶总量
double avgBrokenRate; //班次平均碎茶率
int lightBlockCnt; //轻度结块批次
int heavyBlockCnt; //重度结块批次
bool autoMode;
QString workDesc;
};

class DataMgr : public QObject
{
Q_OBJECT
public:
explicit DataMgr(QObject *parent = nullptr);
~DataMgr();
bool initSqliteDb();
bool insertSensor(const DeBlockSensorData &data);
QList<DeBlockSensorData> querySensor24h();
bool insertAiDetect(const TeaBlockDetectRes &res);
QList<TeaBlockDetectRes> queryAiRecord(int day=7);
bool insertWorkLog(const DeBlockWorkLog &log);
QList<DeBlockWorkLog> queryWorkRecord(int day=30);
bool exportDeBlockCsv(QString savePath, int day=30);
private:
QSqlDatabase m_db;
};
#endif // DATAMGR_H
```

## 3. datamgr.cpp
```cpp
#include "datamgr.h"
#include <QFile>
#include <QTextStream>
#include <QDir>

DataMgr::DataMgr(QObject *parent) : QObject(parent)
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("tea_deblock.db");
if(m_db.open()) initSqliteDb();
}

DataMgr::~DataMgr()
{
if(m_db.isOpen()) m_db.close();
}

bool DataMgr::initSqliteDb()
{
QSqlQuery q;
//实时传感数据表
QString senSql = R"(CREATE TABLE IF NOT EXISTS deblock_sensor(
id INTEGER PRIMARY KEY AUTOINCREMENT,
rec_time DATETIME, feedTonnage REAL, rollerRpm INTEGER, vibrateFreq INTEGER,
hotAirTemp REAL, airHumi REAL, finishedWeight REAL, brokenRate REAL, motorLoad INTEGER
))";
if(!q.exec(senSql)) return false;

//AI茶团视觉检测记录表
QString aiSql = R"(CREATE TABLE IF NOT EXISTS ai_tea_block_detect(
id INTEGER PRIMARY KEY AUTOINCREMENT,
rec_time DATETIME, teaVar INTEGER, blockLevel INTEGER, avgBlockSize REAL,
brokenPercent REAL, stripComplete REAL, snap_path TEXT
))";
if(!q.exec(aiSql)) return false;

//解块生产台账
QString logSql = R"(CREATE TABLE IF NOT EXISTS deblock_work_log(
id INTEGER PRIMARY KEY AUTOINCREMENT,
start_time DATETIME, end_time DATETIME, teaVar INTEGER, totalInputTon REAL,
totalFinishedTon REAL, totalBrokenTon REAL, avgBrokenRate REAL,
lightBlockCnt INTEGER, heavyBlockCnt INTEGER, autoMode INTEGER, desc TEXT
))";
return q.exec(logSql);
}

bool DataMgr::insertSensor(const DeBlockSensorData &data)
{
QSqlQuery q;
q.prepare(R"(INSERT INTO deblock_sensor(rec_time,feedTonnage,rollerRpm,vibrateFreq,hotAirTemp,airHumi,finishedWeight,brokenRate,motorLoad)
VALUES(?,?,?,?,?,?,?,?,?))");
q.addBindValue(data.time.toString("yyyy-MM-dd HH:mm:ss"));
q.addBindValue(data.feedTonnage);
q.addBindValue(data.rollerRpm);
q.addBindValue(data.vibrateFreq);
q.addBindValue(data.hotAirTemp);
q.addBindValue(data.airHumi);
q.addBindValue(data.finishedWeight);
q.addBindValue(data.brokenRate);
q.addBindValue(data.motorLoad);
return q.exec();
}

QList<DeBlockSensorData> DataMgr::querySensor24h()
{
QList<DeBlockSensorData> list;
QSqlQuery q;
q.exec("SELECT * FROM deblock_sensor WHERE rec_time >= datetime('now','-24 hours') ORDER BY rec_time ASC");
while(q.next()){
DeBlockSensorData d;
d.time = QDateTime::fromString(q.value(1).toString(),"yyyy-MM-dd HH:mm:ss");
d.feedTonnage = q.value(2).toDouble();
d.rollerRpm = q.value(3).toInt();
d.vibrateFreq = q.value(4).toInt();
d.hotAirTemp = q.value(5).toDouble();
d.airHumi = q.value(6).toDouble();
d.finishedWeight = q.value(7).toDouble();
d.brokenRate = q.value(8).toDouble();
d.motorLoad = q.value(9).toInt();
list.append(d);
}
return list;
}

bool DataMgr::insertAiDetect(const TeaBlockDetectRes &res)
{
QSqlQuery q;
q.prepare(R"(INSERT INTO ai_tea_block_detect(rec_time,teaVar,blockLevel,avgBlockSize,brokenPercent,stripComplete,snap_path)
VALUES(?,?,?,?,?,?,?))");
q.addBindValue(res.time.toString("yyyy-MM-dd HH:mm:ss"));
q.addBindValue(res.teaVar);
q.addBindValue(res.blockLevel);
q.addBindValue(res.avgBlockSize);
q.addBindValue(res.brokenPercent);
q.addBindValue(res.stripComplete);
q.addBindValue(res.snapPath);
return q.exec();
}

QList<TeaBlockDetectRes> DataMgr::queryAiRecord(int day)
{
QList<TeaBlockDetectRes> list;
QSqlQuery q;
QString sql = QString("SELECT * FROM ai_tea_block_detect WHERE rec_time >= datetime('now','-%1 days') ORDER BY rec_time DESC").arg(day);
q.exec(sql);
while(q.next()){
TeaBlockDetectRes r;
r.time = QDateTime::fromString(q.value(1).toString(),"yyyy-MM-dd HH:mm:ss");
r.teaVar = q.value(2).toInt();
r.blockLevel = q.value(3).toInt();
r.avgBlockSize = q.value(4).toDouble();
r.brokenPercent = q.value(5).toDouble();
r.stripComplete = q.value(6).toDouble();
r.snapPath = q.value(7).toString();
list.append(r);
}
return list;
}

bool DataMgr::insertWorkLog(const DeBlockWorkLog &log)
{
QSqlQuery q;
q.prepare(R"(INSERT INTO deblock_work_log(start_time,end_time,teaVar,totalInputTon,totalFinishedTon,
totalBrokenTon,avgBrokenRate,lightBlockCnt,heavyBlockCnt,autoMode,desc)
VALUES(?,?,?,?,?,?,?,?,?,?,?))");
q.addBindValue(log.startTime.toString("yyyy-MM-dd HH:mm:ss"));
q.addBindValue(log.endTime.toString("yyyy-MM-dd HH:mm:ss"));
q.addBindValue(log.teaVar);
q.addBindValue(log.totalInputTon);
q.addBindValue(log.totalFinishedTon);
q.addBindValue(log.totalBrokenTon);
q.addBindValue(log.avgBrokenRate);
q.addBindValue(log.lightBlockCnt);
q.addBindValue(log.heavyBlockCnt);
q.addBindValue(log.autoMode ? 1 : 0);
q.addBindValue(log.workDesc);
return q.exec();
}

QList<DeBlockWorkLog> DataMgr::queryWorkRecord(int day)
{
QList<DeBlockWorkLog> list;
QSqlQuery q;
QString sql = QString("SELECT * FROM deblock_work_log WHERE start_time >= datetime('now','-%1 days') ORDER BY start_time DESC").arg(day);
q.exec(sql);
while(q.next()){
DeBlockWorkLog r;
r.startTime = QDateTime::fromString(q.value(1).toString(),"yyyy-MM-dd HH:mm:ss");
r.endTime = QDateTime::fromString(q.value(2).toString(),"yyyy-MM-dd HH:mm:ss");
r.teaVar = q.value(3).toInt();
r.totalInputTon = q.value(4).toDouble();
r.totalFinishedTon = q.value(5).toDouble();
r.totalBrokenTon = q.value(6).toDouble();
r.avgBrokenRate = q.value(7).toDouble();
r.lightBlockCnt = q.value(8).toInt();
r.heavyBlockCnt = q.value(9).toInt();
r.autoMode = q.value(10).toBool();
r.workDesc = q.value(11).toString();
list.append(r);
}
return list;
}

bool DataMgr::exportDeBlockCsv(QString savePath, int day)
{
QFile f(savePath);
if(!f.open(QIODevice::WriteOnly | QTextStream::Text)) return false;
QTextStream out(&f);
out<<"开始时间,结束时间,茶叶品类,总进料吨,成品茶吨,碎茶吨,平均碎茶率,轻度结块批次,重度结块批次,自动/手动,备注\n";
auto logs = queryWorkRecord(day);
for(auto &item : logs){
QString teaName;
switch(item.teaVar){
case 0:teaName="小叶红茶";break;
case 1:teaName="嫩芽绿茶";break;
case 2:teaName="黄茶/大叶绿茶";break;
case 3:teaName="普洱晒青毛茶";break;
default:teaName="未知茶类";
}
QString mode = item.autoMode ? "全自动" : "手动调试";
out<<item.startTime.toString("yyyy-MM-dd HH:mm:ss")<<","
<<item.endTime.toString("yyyy-MM-dd HH:mm:ss")<<","
<<teaName<<","<<item.totalInputTon<<","<<item.totalFinishedTon<<","
<<item.totalBrokenTon<<","<<item.avgBrokenRate<<","<<item.lightBlockCnt<<","
<<item.heavyBlockCnt<<","<<mode<<","<<item.workDesc<<"\n";
}
f.close();
return true;
}
```

## 4. aideblocklogic.h AI解块工艺参数决策算法
```cpp
#ifndef AIDEBLOCKLOGIC_H
#define AIDEBLOCKLOGIC_H
#include <QObject>
#include "datamgr.h"

//AI解块输出控制参数
struct AiDeBlockJudge{
bool allowRun; //流水线允许运行
int targetRollerRpm; //目标滚筒转速
int targetVibrateFreq; //振动筛频率
double targetHotTemp; //热风设定温度
double conveyorSpeed; //进料输送速度 m/min
bool overloadAlarm; //电机过载预警
QString blockText; //结块等级文字
QString judgeInfo;
};

class AiDeBlockLogic : public QObject
{
Q_OBJECT
public:
explicit AiDeBlockLogic(QObject *parent = nullptr);
void setTeaVar(TeaVar var);
AiDeBlockJudge calcDeBlockRule(const DeBlockSensorData &sen, const TeaBlockDetectRes &res);
private:
TeaVar m_teaVar;
void loadTeaStandard();
};
#endif // AIDEBLOCKLOGIC_H
```

## 5. aideblocklogic.cpp
```cpp
#include "aideblocklogic.h"

AiDeBlockLogic::AiDeBlockLogic(QObject *parent) : QObject(parent),m_teaVar(VAR_GREENTEA)
{
loadTeaStandard();
}

void AiDeBlockLogic::setTeaVar(TeaVar var)
{
m_teaVar = var;
}

void AiDeBlockLogic::loadTeaStandard()
{
}

AiDeBlockJudge AiDeBlockLogic::calcDeBlockRule(const DeBlockSensorData &sen, const TeaBlockDetectRes &res)
{
AiDeBlockJudge out;
out.allowRun = true;
out.overloadAlarm = false;
out.conveyorSpeed = 8.0;
out.judgeInfo = "茶料结块正常,按标准工艺解块筛分";

//电机过载自锁停机
if(sen.motorLoad > 90){
out.allowRun = false;
out.overloadAlarm = true;
out.judgeInfo += "滚筒电机负载过高,锁定流水线,清理堵塞茶团;";
}

//碎茶超标保护,强制降速降振
if(res.blockLevel == BLOCK_OVERBROKEN){
out.targetRollerRpm *= 0.6;
out.targetVibrateFreq *= 0.7;
out.conveyorSpeed *= 0.5;
out.blockText = "碎茶超标预警";
out.judgeInfo += "碎末占比超标,自动降低转速与振动幅度保护条索;";
return out;
}

//分茶类基础参数赋值
int baseRpm, baseVib;
double baseTemp;
switch(m_teaVar){
case VAR_BLACKTEA:
baseRpm=200; baseVib=275; baseTemp=38; break;
case VAR_GREENTEA:
baseRpm=140; baseVib=250; baseTemp=25; break;
case VAR_YELLOWTEA:
baseRpm=175; baseVib=260; baseTemp=32; break;
case VAR_PUERRAW:
baseRpm=240; baseVib=290; baseTemp=42; break;
default:baseRpm=160;baseVib=260;baseTemp=30;
}
out.targetRollerRpm = baseRpm;
out.targetVibrateFreq = baseVib;
out.targetHotTemp = baseTemp;

//根据结块等级动态修正参数
switch(res.blockLevel){
case BLOCK_LIGHT:
out.targetRollerRpm *= 0.75;
out.targetVibrateFreq *= 0.8;
out.blockText = "轻度结块";
out.judgeInfo += "少量小茶团,低速低振减少碎茶;";
break;
case BLOCK_MID:
out.blockText = "中度结块";
break;
case BLOCK_HEAVY:
out.targetRollerRpm *= 1.2;
out.targetVibrateFreq *= 1.15;
out.conveyorSpeed *= 0.7;
out.blockText = "重度粘团";
out.judgeInfo += "大面积湿茶粘连,提升打散转速,降低进料速度;";
break;
}
return out;
}
```

## 6. deblockctrl.h 流水线整机运动控制
```cpp
#ifndef DEBLOCKCTRL_H
#define DEBLOCKCTRL_H
#include <QObject>
#include <QSerialPort>
#include <QTimer>
#include "datamgr.h"
#include "aideblocklogic.h"

//解块流水线串口设备指令
enum DeBlockRobotCmd{
//进料输送机
FEED_START,FEED_STOP,FEED_SPEED_UP,FEED_SPEED_DOWN,
//双级解块滚筒
ROLLER_START,ROLLER_STOP,ROLLER_SPEED_UP,ROLLER_SPEED_DOWN,
//振动筛分机
VIB_ON,VIB_OFF,VIB_FREQ_UP,VIB_FREQ_DOWN,
//热风温控风机
HEAT_ON,HEAT_OFF,TEMP_UP,TEMP_DOWN,
//三路分料电磁阀:成品/碎茶/茶末
VALVE_FINISH,VALVE_BROKEN,VALVE_DUST,VALVE_RESET,
//过载报警、整机急停
MOTOR_ALARM_ON,MOTOR_ALARM_OFF,ALL_LINE_STOP
};

class DeBlockCtrl : public QObject
{
Q_OBJECT
public:
explicit DeBlockCtrl(QObject *parent = nullptr);
~DeBlockCtrl();
bool openSerial(QString port, int baud=9600);
void closeSerial();
void sendCmd(DeBlockRobotCmd cmd, TeaVar teaType);
bool serialIsOpen();
//AI全自动整批次解块流程
void runAutoDeBlock(int batchTon, AiDeBlockJudge judge, DeBlockSensorData sen, TeaBlockDetectRes res, TeaVar teaType);
signals:
void deviceLog(QString msg);
void batchDeBlockFinish(DeBlockWorkLog log);
private slots:
void readSerialRecv();
private:
QSerialPort m_serial;
QTimer m_heartBeat;
DataMgr *m_dataMgr;
DeBlockWorkLog m_tempLog;
};
#endif // DEBLOCKCTRL_H
```

## 7. 剩余模块简要说明(deblockctrl.cpp、sensorthread、visionthread、mainwindow、main.cpp)
整体架构和前面果蔬农机上位机完全统一,仅适配茶叶解块专属工艺、滚筒/振动筛/热风执行机构、YOLO茶团结块视觉检测逻辑。
### mainwindow.ui界面分区
1. **实时传感监控面板**:进料流量、滚筒转速、振动频率、热风温湿度、碎茶率、电机负载实时数值
2. **茶类工艺选择区**:红茶/嫩芽绿茶/黄茶/普洱毛茶单选,一键切换全套标准参数
3. **串口通信控制面板**:串口下拉、连接断开、心跳通信状态
4. **手动机构调试面板**
- 进料输送启停、加减速
- 解块滚筒启停、调速;振动筛开关、调频
- 热风风机启停、温度升降;三路分料电磁阀单独触发
- 整机紧急停机、电机过载报警复位开关
5. **AI全自动解块操作区**:单次处理吨位输入框、一键启动流水线;AI结块等级、滚筒目标转速、热风温度实时展示
6. **双目视觉双画面窗口**:原始揉捻茶料实拍图、AI标注茶团/碎末分割图
7. **单批次检测统计看板**:平均茶团尺寸、碎茶占比、完整条索占比、工艺判定文字
8. **7天生产产量柱状图表**:成品茶、碎茶、重度结块班次可视化统计
9. **系统日志文本框**:传感器数据、设备动作、AI识别、批次完工、电机过载预警完整记录
10. **台账导出与主题切换**:导出30天CSV茶叶加工溯源档案、浅色/深色界面切换

# 银河麒麟V10 一键编译部署脚本
```bash
# 1. 安装系统依赖
sudo apt update
sudo apt install qtbase5-dev qtcharts5-dev qtserialport5-dev libopencv-dev qtcreator
# 2. Qt Creator新建Qt Widget项目,替换全部.h/.cpp/.pro源码,拖拽绘制UI界面
# 3. 将YOLO茶团识别模型 tea_block_yolo.onnx 放入bin运行目录
# 4. qmake → 构建项目,运行bin目录可执行程序
```

# 配套茶叶解块流水线硬件清单
1. 爬坡式均料皮带输送机、进料光电料位传感器
2. 双级齿辊伺服解块滚筒、高精度转速编码器、负载电流采集模块
3. 多级分层振动筛分机、可调频激振器、三路分料气动电磁阀
4. 恒温热风风道、温湿度变送器、变频热风风机
5. 环形3D双目工业相机、柔光LED防尘补光箱
6. 成品/碎茶在线重量计量传感器、流量监测模块
7. 飞腾/龙芯国产ARM工控机、银河麒麟/统信UOS国产操作系统

# 项目核心亮点(茶厂技改毕设/农机竞赛/信创农业验收)
1. **四大主流茶类自适应标准化解块系统** 严格匹配红茶、绿茶、黄茶、普洱初制加工工艺,内置专属转速、振动、热风参数,AI根据结块程度动态调参,平衡**充分打散**与**减少碎茶**两大核心需求。
2. **YOLO视觉实时识别茶团结块等级** 在线分割识别揉捻茶团大小、粘连程度、碎末占比,自动区分轻/中/重度结块,杜绝人工凭经验调参带来的品质波动,稳定条索完整度。
3. **多重设备自锁安全机制** 滚筒电机过载自动停机防堵;碎茶超标强制降速保护原料;温湿度异常提示调整进料含水率,避免发酵不均影响茶叶香气滋味。
4. **一体化全自动连续解块筛分流水线** 均料上料→AI视觉检测→伺服解块打散→多级分层筛分→三路自动分料出料,小时处理能力1–3吨干揉捻叶,完全替代人工解块、人工筛分两道工序。
5. **茶叶加工全流程溯源生产台账** 自动记录班次总进料、成品茶产出、碎茶损耗、结块频次,CSV导出档案满足茶叶SC生产许可、农产品质量溯源、茶厂标准化管理要求。
6. **全栈国产化信创适配** 全部开源软件组件,兼容飞腾、龙芯ARM国产工控,国产麒麟、统信系统稳定运行,无商业闭源依赖。
7. **多线程隔离稳定架构+双操作模式** 视觉推理、传感采集、设备运动控制三线程解耦,制茶车间24h高粉尘高湿度环境长时间运行UI无卡顿;支持单机手动检修、全自动连续流水线作业,适配大中型红茶绿茶普洱标准化初制加工厂。

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

相关文章:

  • SleeperX:重构Mac电源管理体验的开源智能睡眠工具
  • Tauri + React + Rust 构建轻量级桌面番茄钟:从技术选型到打包分发
  • 文本分析可视化:力导向图展示词频与相关性
  • 源网荷储一体化微电网智慧能源管理平台
  • 移动端装配体交互:从CAD轻量化到实时拆解的技术实现
  • SpringBoot+Vue教研系统开发实战与架构解析
  • ESP32蓝牙学习总结
  • 2026年8月四川省南充市联通融合宽带避坑攻略 - 领卡园地
  • 微信视频号直播监控工具wxlivespy:深度解析与实战指南
  • DeepSeek V4 Pro编程助手实战:从API调用到IDE集成的完整指南
  • 货币投放结构优化与定向调控工具创新应用
  • 3D OpenPose Editor:5分钟打造你的AI角色姿态控制神器!
  • Java数据结构实战:从原理到性能优化
  • Windows更新卡顿修复终极指南:Reset Windows Update Tool完全教程
  • 030_简单30秒操作彻底禁止 Windows 自动更新
  • VMware Tools 手动安装全攻略:解决灰色按钮问题,提升虚拟机性能
  • 轻松回归高效工作流:用ExplorerPatcher重塑你的Windows体验
  • 智能词典笔如何重塑K12英语学习流:从查词工具到效率伙伴
  • KVM主题:中断注入与APIC虚拟化原理
  • 2026年8月四川省南充市联通融合宽带攻略与避坑指南 - 领卡园地
  • Claw平台选型指南:四大方案对比与实战建议
  • AI指环与项链:无感交互与贴身智能如何重塑穿戴设备未来
  • python神经网络编程入门(二)----从XOR死穴到生物神经元——为什么单一直线搞不定,要堆一堆神经元?
  • 显卡驱动深度清理终极指南:Display Driver Uninstaller(DDU)完整使用教程
  • 终极指南:如何用Plain Craft Launcher 2轻松管理你的Minecraft游戏体验
  • MoE架构与INT4量化:基于Ling-3.0-flash与SGLang的高性能大模型推理部署实战
  • 免费解锁WeMod Pro会员功能:Wand-Enhancer完整使用指南
  • 成都装修别盲目选!2026年业主实测家装公司参考 - 五大品牌极选
  • C++20模块化编程:提升编译速度与代码管理
  • 为什么Windows资源管理器总是缺少现代感?5种模糊效果让你重新爱上文件管理