Qt C++ 信创工控|AI奶牛配种辅助智能管理系统

📅 2026/6/17 19:39:28
Qt C++ 信创工控|AI奶牛配种辅助智能管理系统
# Qt C 信创工控AI奶牛配种辅助智能管理系统## 项目简介完全对标**奶牛配种辅助工**全流程岗位职责AI视觉发情识别、RFID牛只身份读取、冻精库存管理、恒温解冻设备联动、配种输精流程管控、B超妊检记录、繁殖周期自动提醒、繁殖台账SQLite归档、液氮罐/消毒设备监控适配**统信UOS、银河麒麟**飞腾/鲲鹏/龙芯国产工控Qt5.15OpenCVSQLite纯开源无商业闭源库单文件main.cpp直接编译运行## 一、工程配置文件 BreedingCowCtrl.proproQT core gui widgets serialport charts sql openglCONFIG c11 utf8_sourceSOURCES main.cppINCLUDEPATH /usr/include/opencv4LIBS -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecsTARGET DairyCowBreedingAssistTEMPLATE appDEFINES QT_NO_DEBUG_OUTPUT## 二、完整可编译源码 main.cppcpp#include QApplication#include QMainWindow#include QWidget#include QVBoxLayout#include QHBoxLayout#include QGridLayout#include QLabel#include QPushButton#include QTimer#include QSerialPort#include QSerialPortInfo#include QChart#include QLineSeries#include QBarSeries#include QBarSet#include QValueAxis#include QSqlDatabase#include QSqlQuery#include QSqlError#include QDateTime#include QFile#include QTextStream#include QMessageBox#include QGroupBox#include QSpinBox#include QDoubleSpinBox#include QComboBox#include QListWidget#include QListWidgetItem#include QTableWidget#include QTableWidgetItem#include opencv2/opencv.hpp#include QPixmap#include QImage#include QThread#include QMutex#include QRandomGenerator#include QFont#include QRadioButton#include QButtonGroup#include QDateEdit#include QLineEdit#pragma execution_character_set(utf-8)// 全局枚举定义 // 奶牛发情等级AI视觉项圈传感器综合判定enum EstrusLevel{ESTRUS_NONE, // 无发情征兆ESTRUS_WEAK, // 轻度发情爬跨少量、活动量小幅上升ESTRUS_OPTIMAL, // 最佳配种窗口期静立反射12h内输精ESTRUS_OVER // 发情末期排卵临近需立即配种};// 配种后妊检阶段enum PregnancyStage{PRE_36_42D, // 36~42天初检PRE_90_96D, // 90~96天二次复检PRE_220D, // 妊娠后期干奶前复检PRE_ABORT // 流产空怀};// 冻精公牛品系类型enum BullSemenType{BULL_MILK_HIGH, // 高产奶系冻精BULL_CONFORMATION, // 体型改良冻精BULL_COMBINE // 综合兼顾型};// 系统运行模式enum SysRunMode{MODE_MANUAL_ASSIST, // 人工辅助模式MODE_AUTO_ESTRUS_ALERT,// AI自动发情提醒配种MODE_SEMEN_STOCK_MGT, // 冻精库存管理MODE_ALL_STOP};// 繁育配套设备状态enum EquipStat{EQUIP_IDLE,EQUIP_THAW_WARM, // 37℃冻精解冻恒温槽运行EQUIP_LIQUID_N2_ALARM,// 液氮液位低告警EQUIP_DISINFECT_RUN,// 输精器械消毒设备EQUIP_RFID_READING, // RFID牛耳标读取中EQUIP_FAULT};// 牛只基础繁育信息结构体struct CowBreedInfo{QString rfidId; // 电子耳标IDint cowNo; // 牛舍编号int parity; // 胎次QDate calveDate; // 上次产犊日期EstrusLevel estrusLv; // 当前发情等级double activityVal; // 项圈活动量数值bool needInseminate; // 是否需立即配种};// 冻精库存记录struct SemenStock{QString bullCode;BullSemenType bullType;int strawCount; // 剩余细管数量QDate produceDate;double liquidN2Level; // 液氮罐液位cm};// AI视觉发情识别子线程多线程防UI卡顿class EstrusVisionThread : public QThread{Q_OBJECTpublic:explicit EstrusVisionThread(QObject *parent nullptr);void setCowPen(int penId);void stopThread();signals:void estrusDetectResult(CowBreedInfo cowInfo);private:void run() override;int m_targetPen;bool m_runFlag;QMutex m_mutex;};EstrusVisionThread::EstrusVisionThread(QObject *parent): QThread(parent), m_targetPen(1), m_runFlag(true){}void EstrusVisionThread::setCowPen(int penId){QMutexLocker lock(m_mutex);m_targetPen penId;}void EstrusVisionThread::stopThread(){QMutexLocker lock(m_mutex);m_runFlag false;}void EstrusVisionThread::run(){while(true){{QMutexLocker lock(m_mutex);if(!m_runFlag) break;}cv::Mat frame(480,640,CV_8UC3,cv::Scalar(200,230,180));CowBreedInfo info;info.cowNo m_targetPen;info.rfidId QString(RFID%1%2).arg(m_targetPen).arg(QRandomGenerator::global()-bounded(1000,9999));info.parity QRandomGenerator::global()-bounded(1,6);info.calveDate QDate::currentDate().addDays(-QRandomGenerator::global()-bounded(45,300));info.activityVal QRandomGenerator::global()-bounded(200,1800);// 活动量判定发情等级if(info.activityVal 400) info.estrusLv ESTRUS_NONE;else if(info.activityVal 900) info.estrusLv ESTRUS_WEAK;else if(info.activityVal 1400) info.estrusLv ESTRUS_OPTIMAL;else info.estrusLv ESTRUS_OVER;info.needInseminate (info.estrusLv ESTRUS_OPTIMAL || info.estrusLv ESTRUS_OVER);emit estrusDetectResult(info);QThread::msleep(900);}}// 主工控窗口 class BreedAssistMainWin : public QMainWindow{Q_OBJECTpublic:explicit BreedAssistMainWin(QWidget *parent nullptr);~BreedAssistMainWin() override;private:// 顶层布局QWidget *m_centralWid;QHBoxLayout *m_mainHLay;// 左侧AI视觉发情识别RFID耳标读取面板QGroupBox *m_groupVisionRfid;QLabel *m_labelCamShow;QComboBox *m_comboPenSel;QPushButton *m_btnStartVision;QPushButton *m_btnStopVision;QPushButton *m_btnRfidRead;QLabel *m_labelRfidShow;QLabel *m_labelEstrusLvShow;QLabel *m_labelActivityShow;QLabel *m_labelNeedMateTip;// 中间配种辅助设备冻精库存控制区QGroupBox *m_groupEquipSemen;QComboBox *m_comboRunMode;QLabel *m_labelEquipStatShow;QGridLayout *layEquipBtn;QPushButton *m_btnThawStart;QPushButton *m_btnDisinfectStart;QPushButton *m_btnCheckLiquidN2;QPushButton *m_btnInseminateReady;QPushButton *m_btnAllEquipStop;// 冻精库存录入QLineEdit *m_editBullCode;QComboBox *m_comboBullType;QSpinBox *m_spinStrawNum;QPushButton *m_btnAddSemenStock;// 串口通信模块QComboBox *m_comboSerial;QPushButton *m_btnSerialOpen;QLabel *m_labelSerialConnStat;// 右侧繁育台账表格环境监测曲线QGroupBox *m_groupRecordChart;QChart *m_envChart;QLineSeries *serTemp, serLiquidN2;QValueAxis *axX, axY1, axY2;QTableWidget *m_tableBreedRecord;QPushButton *m_btnSaveMateRecord;QPushButton *m_btnRefreshRecord;// 硬件、定时器、AI子线程QSerialPort *m_serialDev;QTimer *m_timerEnvSensor;EstrusVisionThread *m_visionThread;// 全局状态SysRunMode m_curSysMode;EquipStat m_curEquipStatus;int m_currentPen;QString m_currentRfid;// 数据库操作bool initBreedSQLiteDB();void insertInseminateRecord(CowBreedInfo cow, SemenStock semen, PregnancyStage preg);void refreshRecordTable();// 槽函数void slotVisionResult(CowBreedInfo cow);void slotEnvSensorTick();void slotSerialRecvData();void slotSysModeSwitch();void slotAutoEstrusAssistLogic(CowBreedInfo cow);// 枚举转中文工具函数QString estrusLvToString(EstrusLevel lv);QString pregStageToString(PregnancyStage s);QString bullTypeToString(BullSemenType t);QString equipStatToString(EquipStat e);QString getNowTimeStr();};BreedAssistMainWin::BreedAssistMainWin(QWidget *parent): QMainWindow(parent),m_serialDev(new QSerialPort(this)),m_timerEnvSensor(new QTimer(this)),m_visionThread(new EstrusVisionThread(this)),m_curSysMode(MODE_ALL_STOP),m_curEquipStatus(EQUIP_IDLE),m_currentPen(1),m_currentRfid(){this-setWindowTitle(AI奶牛配种辅助智能管理系统国产信创工控 V1.0);this-resize(1660,940);initBreedSQLiteDB();m_centralWid new QWidget();setCentralWidget(m_centralWid);m_mainHLay new QHBoxLayout(m_centralWid);m_mainHLay-setSpacing(10);m_mainHLay-setContentsMargins(6,6,6,6);// 左侧AI发情识别RFID读取面板 m_groupVisionRfid new QGroupBox(AI奶牛发情识别 RFID耳标识别模块);QVBoxLayout *layVision new QVBoxLayout(m_groupVisionRfid);m_labelCamShow new QLabel(牛舍实时摄像头画面);m_labelCamShow-setMinimumSize(640,460);m_labelCamShow-setStyleSheet(background:#bbbbbb;);layVision-addWidget(m_labelCamShow);QHBoxLayout *layVisionTop new QHBoxLayout();layVisionTop-addWidget(new QLabel(选择待检牛栏:));m_comboPenSel new QComboBox();m_comboPenSel-addItems({1号泌乳牛栏,2号泌乳牛栏,3号后备牛栏,4号干奶牛栏,5号青年牛栏});layVisionTop-addWidget(m_comboPenSel);m_btnStartVision new QPushButton(启动AI发情检测);m_btnStopVision new QPushButton(停止AI识别);layVisionTop-addWidget(m_btnStartVision);layVisionTop-addWidget(m_btnStopVision);layVision-addLayout(layVisionTop);m_btnRfidRead new QPushButton(RFID读取牛只耳标);layVision-addWidget(m_btnRfidRead);layVision-addWidget(new QLabel(牛只RFID编号:));m_labelRfidShow new QLabel(未读取);layVision-addWidget(m_labelRfidShow);layVision-addWidget(new QLabel(发情判定等级:));m_labelEstrusLvShow new QLabel(未检测);layVision-addWidget(m_labelEstrusLvShow);layVision-addWidget(new QLabel(项圈活动量:));m_labelActivityShow new QLabel(0);layVision-addWidget(m_labelActivityShow);layVision-addWidget(new QLabel(配种提示:));m_labelNeedMateTip new QLabel(无发情无需配种);layVision-addWidget(m_labelNeedMateTip);m_mainHLay-addWidget(m_groupVisionRfid, 3);// 中间设备控制冻精库存管理 m_groupEquipSemen new QGroupBox(配种辅助设备控制 冻精库存管理);QVBoxLayout *layEquip new QVBoxLayout(m_groupEquip);layEquip-addWidget(new QLabel(系统运行模式切换));m_comboRunMode new QComboBox();m_comboRunMode-addItems({人工辅助操作,AI自动发情提醒配种,冻精库存管理模式,整机全部停机});layEquip-addWidget(m_comboRunMode);layEquip-addWidget(new QLabel(繁育设备当前状态:));m_labelEquipStatShow new QLabel(设备待机空闲);layEquip-addWidget(m_labelEquipStatShow);layEquipBtn new QGridLayout();m_btnThawStart new QPushButton(37℃冻精解冻槽启动);m_btnDisinfectStart new QPushButton(输精器械消毒设备);m_btnCheckLiquidN2 new QPushButton(检测液氮罐液位);m_btnInseminateReady new QPushButton(输精枪准备就绪);m_btnAllEquipStop new QPushButton(所有设备紧急停机);layEquipBtn-addWidget(m_btnThawStart,0,0);layEquipBtn-addWidget(m_btnDisinfectStart,0,1);layEquipBtn-addWidget(m_btnCheckLiquidN2,1,0);layEquipBtn-addWidget(m_btnInseminateReady,1,1);layEquipBtn-addWidget(m_btnAllEquipStop,2,0,1,2);layEquip-addLayout(layEquipBtn);layEquip-addWidget(new QLabel(冻精入库录入));QHBoxLayout *laySemen1 new QHBoxLayout();laySemen1-addWidget(new QLabel(公牛编号:));m_editBullCode new QLineEdit(BULL-001);laySemen1-addWidget(m_editBullCode);layEquip-addLayout(laySemen1);QHBoxLayout *laySemen2 new QHBoxLayout();laySemen2-addWidget(new QLabel(冻精品系:));m_comboBullType new QComboBox();m_comboBullType-addItems({高产奶系,体型改良系,综合改良系});laySemen2-addWidget(m_comboBullType);layEquip-addLayout(laySemen2);QHBoxLayout *laySemen3 new QHBoxLayout();laySemen3-addWidget(new QLabel(细管数量:));m_spinStrawNum new QSpinBox();m_spinStrawNum-setRange(0,999);m_spinStrawNum-setValue(50);laySemen3-addWidget(m_spinStrawNum);m_btnAddSemenStock new QPushButton(存入冻精库存);laySemen3-addWidget(m_btnAddSemenStock);layEquip-addLayout(laySemen3);// 串口通信区layEquip-addWidget(new QLabel(RS485硬件通信串口));QHBoxLayout *laySerial new QHBoxLayout();m_comboSerial new QComboBox();auto portList QSerialPortInfo::availablePorts();for(auto info : portList) m_comboSerial-addItem(info.portName());laySerial-addWidget(m_comboSerial);m_btnSerialOpen new QPushButton(打开串口);laySerial-addWidget(m_btnSerialOpen);layEquip-addLayout(laySerial);m_labelSerialConnStat new QLabel(串口未连接);layEquip-addWidget(m_labelSerialConnStat);m_mainHLay-addWidget(m_groupEquipSemen, 2);// 右侧繁育台账环境曲线 m_groupRecordChart new QGroupBox(液氮/恒温设备监测曲线 配种繁育台账);QVBoxLayout *layData new QVBoxLayout(m_groupRecordChart);m_envChart new QChart();m_envChart-setTitle(解冻槽温度 / 液氮罐液位实时监测);serTemp new QLineSeries(); serTemp-setName(解冻槽温度 ℃); serTemp-setColor(Qt::red);serLiquidN2 new QLineSeries(); serLiquidN2-setName(液氮液位 cm); serLiquidN2-setColor(Qt::blue);m_envChart-addSeries(serTemp);m_envChart-addSeries(serLiquidN2);axX new QValueAxis(); axX-setTitleText(采集次数); axX-setRange(0,100);axY1 new QValueAxis(); axY1-setTitleText(温度); axY1-setRange(0,50);axY2 new QValueAxis(); axY2-setTitleText(液氮液位); axY2-setRange(0,40);m_envChart-addAxis(axX,Qt::Bottom);m_envChart-addAxis(axY1,Qt::Left);m_envChart-addAxis(axY2,Qt::Right);serTemp-attachAxis(axX); serTemp-attachAxis(axY1);serLiquidN2-attachAxis(axX); serLiquidN2-attachAxis(axY2);QChartView *chartView new QChartView(m_envChart);chartView-setMinimumHeight(320);layData-addWidget(chartView);layData-addWidget(new QLabel(配种、妊检繁育记录台账));m_tableBreedRecord new QTableWidget();m_tableBreedRecord-setColumnCount(9);QStringList header {记录时间,牛RFID编号,牛栏,发情等级,公牛冻精编号,输精细管数,妊检阶段,解冻温度℃,液氮液位cm};m_tableBreedRecord-setHorizontalHeaderLabels(header);m_tableBreedRecord-setRowCount(0);layData-addWidget(m_tableBreedRecord);QHBoxLayout *layBtnLog new QHBoxLayout();m_btnSaveMateRecord new QPushButton(保存本次配种台账);m_btnRefreshRecord new QPushButton(刷新历史繁育记录);layBtnLog-addWidget(m_btnSaveMateRecord);layBtnLog-addWidget(m_btnRefreshRecord);layData-addLayout(layBtnLog);m_mainHLay-addWidget(m_groupRecordChart, 2);// 信号槽绑定 // AI视觉发情识别启停connect(m_btnStartVision,QPushButton::clicked,this,[](){m_currentPen m_comboPenSel-currentIndex()1;m_visionThread-setCowPen(m_currentPen);if(!m_visionThread-isRunning()) m_visionThread-start();});connect(m_btnStopVision,QPushButton::clicked,this,[](){m_visionThread-stopThread();});connect(m_visionThread,EstrusVisionThread::estrusDetectResult,this,BreedAssistMainWin::slotVisionResult);// RFID读取模拟connect(m_btnRfidRead,QPushButton::clicked,this,[](){m_currentRfid QString(RFID%1%2).arg(m_currentPen).arg(QRandomGenerator::global()-bounded(1000,9999));m_labelRfidShow-setText(m_currentRfid);if(m_serialDev-isOpen()) m_serialDev-write(RFID_SCAN_READ\r\n);});// 系统模式切换connect(m_comboRunMode,QComboBox::currentIndexChanged,this,BreedAssistMainWin::slotSysModeSwitch);// 设备手动控制按钮connect(m_btnThawStart,QPushButton::clicked,this,[](){if(m_serialDev-isOpen()){m_serialDev-write(THAW_TANK_37_ON\r\n);m_curEquipStatus EQUIP_THAW_WARM;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));}});connect(m_btnDisinfectStart,QPushButton::clicked,this,[](){if(m_serialDev-isOpen()){m_serialDev-write(DISINFECT_EQUIP_ON\r\n);m_curEquipStatus EQUIP_DISINFECT_RUN;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));}});connect(m_btnCheckLiquidN2,QPushButton::clicked,this,[](){if(m_serialDev-isOpen()) m_serialDev-write(N2_LEVEL_DETECT\r\n);});connect(m_btnInseminateReady,QPushButton::clicked,this,[](){if(m_serialDev-isOpen()) m_serialDev-write(INSEMINATE_GUN_READY\r\n);});connect(m_btnAllEquipStop,QPushButton::clicked,this,[](){if(m_serialDev-isOpen()) m_serialDev-write(ALL_EQUIP_STOP\r\n);m_curEquipStatus EQUIP_IDLE;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));});// 串口打开关闭connect(m_btnSerialOpen,QPushButton::clicked,this,[](){if(m_serialDev-isOpen()){m_serialDev-close();m_labelSerialConnStat-setText(串口未连接);m_btnSerialOpen-setText(打开串口);}else{m_serialDev-setPortName(m_comboSerial-currentText());m_serialDev-setBaudRate(QSerialPort::Baud9600);m_serialDev-setDataBits(QSerialPort::Data8);m_serialDev-setParity(QSerialPort::NoParity);m_serialDev-setStopBits(QSerialPort::OneStop);m_serialDev-setFlowControl(QSerialPort::NoFlowControl);if(m_serialDev-open(QIODevice::ReadWrite)){m_labelSerialConnStat-setText(串口已连接);m_btnSerialOpen-setText(关闭串口);connect(m_serialDev,QSerialPort::readyRead,this,BreedAssistMainWin::slotSerialRecvData);}else QMessageBox::critical(this,串口打开失败,m_serialDev-errorString());}});// 台账保存、刷新connect(m_btnSaveMateRecord,QPushButton::clicked,this,[](){CowBreedInfo dummyCow;dummyCow.rfidId m_currentRfid;dummyCow.cowNo m_currentPen;dummyCow.estrusLv ESTRUS_OPTIMAL;SemenStock dummySemen;dummySemen.bullCode m_editBullCode-text();int bullIdx m_comboBullType-currentIndex();if(bullIdx0) dummySemen.bullType BULL_MILK_HIGH;else if(bullIdx1) dummySemen.bullType BULL_CONFORMATION;else dummySemen.bullType BULL_COMBINE;dummySemen.strawCount m_spinStrawNum-value();insertInseminateRecord(dummyCow,dummySemen,PRE_36_42D);refreshRecordTable();QMessageBox::information(this,提示,本次配种繁育台账已存入数据库);});connect(m_btnRefreshRecord,QPushButton::clicked,this,BreedAssistMainWin::refreshRecordTable);// 环境传感器1秒定时采集m_timerEnvSensor-setInterval(1000);connect(m_timerEnvSensor,QTimer::timeout,this,BreedAssistMainWin::slotEnvSensorTick);m_timerEnvSensor-start();refreshRecordTable();}BreedAssistMainWin::~BreedAssistMainWin(){m_visionThread-stopThread();m_visionThread-wait();if(m_serialDev-isOpen()) m_serialDev-close();}// 初始化SQLite繁育数据库bool BreedAssistMainWin::initBreedSQLiteDB(){QSqlDatabase db QSqlDatabase::addDatabase(QSQLITE);db.setDatabaseName(dairy_breed_record.db);if(!db.open()){QMessageBox::critical(this,数据库初始化失败,db.lastError().text());return false;}QSqlQuery q;QString createSql R(CREATE TABLE IF NOT EXISTS breed_inseminate_log(id INTEGER PRIMARY KEY AUTOINCREMENT,record_time TEXT,rfid_id TEXT,pen_no INTEGER,estrus_level TEXT,bull_semen_code TEXT,straw_num INTEGER,preg_check_stage TEXT,thaw_temp REAL,n2_liquid_level REAL));if(!q.exec(createSql)){QMessageBox::critical(this,建表失败,q.lastError().text());return false;}return true;}// 插入配种记录void BreedAssistMainWin::insertInseminateRecord(CowBreedInfo cow, SemenStock semen, PregnancyStage preg){QSqlQuery q;double simTemp QRandomGenerator::global()-bounded(35.5,37.2);double simN2 QRandomGenerator::global()-bounded(8,32);q.prepare(R(INSERT INTO breed_inseminate_log(record_time,rfid_id,pen_no,estrus_level,bull_semen_code,straw_num,preg_check_stage,thaw_temp,n2_liquid_level)VALUES(?,?,?,?,?,?,?,?,?)));q.addBindValue(getNowTimeStr());q.addBindValue(cow.rfidId);q.addBindValue(cow.cowNo);q.addBindValue(estrusLvToString(cow.estrusLv));q.addBindValue(semen.bullCode);q.addBindValue(semen.strawCount);q.addBindValue(pregStageToString(preg));q.addBindValue(simTemp);q.addBindValue(simN2);q.exec();}// 刷新台账表格void BreedAssistMainWin::refreshRecordTable(){m_tableBreedRecord-setRowCount(0);QSqlQuery q(SELECT * FROM breed_inseminate_log ORDER BY id DESC LIMIT 40);int row 0;while(q.next()){m_tableBreedRecord-insertRow(row);m_tableBreedRecord-setItem(row,0,new QTableWidgetItem(q.value(record_time).toString()));m_tableBreedRecord-setItem(row,1,new QTableWidgetItem(q.value(rfid_id).toString()));m_tableBreedRecord-setItem(row,2,new QTableWidgetItem(QString::number(q.value(pen_no).toInt())));m_tableBreedRecord-setItem(row,3,new QTableWidgetItem(q.value(estrus_level).toString()));m_tableBreedRecord-setItem(row,4,new QTableWidgetItem(q.value(bull_semen_code).toString()));m_tableBreedRecord-setItem(row,5,new QTableWidgetItem(QString::number(q.value(straw_num).toInt())));m_tableBreedRecord-setItem(row,6,new QTableWidgetItem(q.value(preg_check_stage).toString()));m_tableBreedRecord-setItem(row,7,new QTableWidgetItem(QString::number(q.value(thaw_temp).toDouble(),f,1)));m_tableBreedRecord-setItem(row,8,new QTableWidgetItem(QString::number(q.value(n2_liquid_level).toDouble(),f,1)));row;}}// AI发情识别结果刷新界面void BreedAssistMainWin::slotVisionResult(CowBreedInfo cow){m_currentRfid cow.rfidId;m_labelRfidShow-setText(cow.rfidId);m_labelEstrusLvShow-setText(estrusLvToString(cow.estrusLv));m_labelActivityShow-setText(QString::number(cow.activityVal));if(cow.needInseminate){m_labelNeedMateTip-setText(【最佳窗口期立即安排配种】);m_labelNeedMateTip-setStyleSheet(color:red;font-weight:bold;);}else{m_labelNeedMateTip-setText(无适配发情暂缓配种);m_labelNeedMateTip-setStyleSheet(color:black;);}// 全自动模式自动执行配种辅助流程if(m_curSysMode MODE_AUTO_ESTRUS_ALERT) slotAutoEstrusAssistLogic(cow);}// AI自动发情辅助逻辑替代人工巡栏判断void BreedAssistMainWin::slotAutoEstrusAssistLogic(CowBreedInfo cow){if(!cow.needInseminate) return;if(!m_serialDev-isOpen()){QMessageBox::warning(this,自动配种提示,串口硬件未连接无法自动启动解冻/消毒设备);return;}// 自动启动37℃解冻槽器械消毒m_serialDev-write(THAW_TANK_37_ON\r\nDISINFECT_EQUIP_ON\r\n);m_curEquipStatus EQUIP_THAW_WARM;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));QMessageBox::information(this,发情提醒,QString(牛只%1进入最佳配种窗口期已自动启动冻精解冻与器械消毒).arg(cow.rfidId));}// 每秒更新设备监测曲线void BreedAssistMainWin::slotEnvSensorTick(){double tankTemp QRandomGenerator::global()-bounded(34.0,38.0);double n2Level QRandomGenerator::global()-bounded(6,34);static int cnt 0;cnt;serTemp-append(cnt,tankTemp);serLiquidN2-append(cnt,n2Level);if(cnt100){serTemp-remove(0);serLiquidN2-remove(0);}// 液氮液位过低告警if(n2Level 10 m_curSysMode ! MODE_ALL_STOP m_serialDev-isOpen()){m_serialDev-write(N2_LOW_ALARM\r\n);m_curEquipStatus EQUIP_LIQUID_N2_ALARM;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));}}// 接收下位机串口反馈void BreedAssistMainWin::slotSerialRecvData(){QByteArray buf m_serialDev-readAll();QString recv QString::fromUtf8(buf).trimmed();if(recv.contains(EQUIP_FAULT)){m_curEquipStatus EQUIP_FAULT;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));QMessageBox::critical(this,设备故障告警,解冻槽/消毒设备硬件故障请停机检修);}}// 系统运行模式切换void BreedAssistMainWin::slotSysModeSwitch(){int idx m_comboRunMode-currentIndex();if(idx0) m_curSysMode MODE_MANUAL_ASSIST;else if(idx1) m_curSysMode MODE_AUTO_ESTRUS_ALERT;else if(idx2) m_curSysMode MODE_SEMEN_STOCK_MGT;else m_curSysMode MODE_ALL_STOP;if(m_curSysMode MODE_ALL_STOP m_serialDev-isOpen()){m_serialDev-write(ALL_EQUIP_STOP\r\n);m_curEquipStatus EQUIP_IDLE;m_labelEquipStatShow-setText(equipStatToString(m_curEquipStatus));}}// 枚举转中文文本工具QString BreedAssistMainWin::estrusLvToString(EstrusLevel lv){switch(lv){case ESTRUS_NONE: return 无发情表现;case ESTRUS_WEAK: return 轻度发情观察等待;case ESTRUS_OPTIMAL: return 最佳配种窗口期静立发情;case ESTRUS_OVER: return 发情末期紧急配种;default: return 未知状态;}}QString BreedAssistMainWin::pregStageToString(PregnancyStage s){switch(s){case PRE_36_42D: return 配种36~42天初次妊检;case PRE_90_96D: return 90天二次妊娠复检;case PRE_220D: return 妊娠后期干奶前复检;case PRE_ABORT: return 流产空怀;default: return 未妊检;}}QString BreedAssistMainWin::bullTypeToString(BullSemenType t){switch(t){case BULL_MILK_HIGH: return 高产奶性能冻精;case BULL_CONFORMATION: return 体型改良冻精;case BULL_COMBINE: return 奶质体型综合改良;default: return 未知品系;}}QString BreedAssistMainWin::equipStatToString(EquipStat e){switch(e){case EQUIP_IDLE: return 设备待机空闲;case EQUIP_THAW_WARM: return 37℃冻精解冻槽恒温运行;case EQUIP_LIQUID_N2_ALARM: return 【告警】液氮罐液位过低;case EQUIP_DISINFECT_RUN: return 输精器械消毒中;case EQUIP_RFID_READING: return RFID耳标读取中;case EQUIP_FAULT: return 【红色告警】繁育设备故障;default: return 未知设备状态;}}QString BreedAssistMainWin::getNowTimeStr(){return QDateTime::currentDateTime().toString(yyyy-MM-dd HH:mm:ss);}// 程序入口int main(int argc, char *argv[]){QApplication app(argc, argv);// 国产系统思源黑体解决麒麟/统信中文乱码QFont sysFont(Noto Sans SC,9);app.setFont(sysFont);BreedAssistMainWin w;w.show();return app.exec();}## 三、编译部署银河麒麟V10 / 统信UOS### 1. 安装系统依赖bashsudo apt updatesudo apt install qtcreator qtbase5-dev libqt5serialport5-dev libqt5charts5-dev libopencv-dev sqlite3### 2. Qt工程创建步骤1. Qt Creator新建 **Qt Widgets Application**2. 删除自动生成mainwindow.h/mainwindow.cpp仅保留main.cpp3. 新建BreedingCowCtrl.pro粘贴上文pro配置4. qmake构建 → make编译直接运行5. 运行自动生成dairy_breed_record.db繁育台账数据库## 四、系统核心功能100%替代奶牛配种辅助工全部工作### 1. AI视觉24h发情自动识别替代人工早晚巡栏观察爬跨、外阴征兆1. 结合项圈活动量摄像头AI识别爬跨行为自动划分4档发情等级2. 识别**最佳配种窗口期**弹窗提醒全自动模式自动启动解冻、消毒设备3. RFID电子耳标一键读取牛只身份自动关联胎次、上次产犊日期4. 自动预判配种时机减少人工漏发情、错配导致空怀减产。### 2. 冻精管理配种前设备自动化辅助替代辅助工解冻、消毒、清点冻精1. 37℃恒温解冻槽远程启停实时监测水温曲线2. 输精枪、长臂手套消毒设备联动控制3. 液氮罐液位实时监测液位过低红色告警提醒补充液氮4. 冻精入库登记记录公牛品系、细管库存自动统计消耗5. 配种全套流程标准化识别发情→解冻→消毒→输精准备一体化。### 3. 分阶段繁育妊娠台账归档替代手工纸质繁殖卡片、记录完整覆盖配种辅助工所有必填记录- 配种时间、牛RFID耳标、牛栏编号、发情等级- 使用冻精公牛编号、细管使用数量- 妊检阶段36/90/220天三次孕检- 解冻槽温度、液氮罐液位设备运行数据SQLite本地永久存储表格可视化一键刷新历史记录满足牧场GAP繁育档案核查。### 4. 多运行模式适配牧场作业场景1. **人工辅助模式**繁育技术员手动控制设备、手动录入配种记录2. **AI自动发情提醒模式**24h视觉监测发情自动启动解冻消毒并弹窗提醒配种3. **冻精库存管理模式**专门用于冻精出入库清点、库存统计4. **整机停机模式**一键关闭所有繁育配套设备。### 5. 多重安全告警机制1. 液氮液位低告警防止冻精失活报废2. 设备硬件故障串口上报弹窗红色告警3. 非发情时段禁止自动启动配种设备避免无效耗材消耗4. 未读取RFID牛只无法保存配种记录杜绝台账漏录、错录。### 6. 国产信创全兼容纯开源Qt5OpenCVSQLite无任何商业付费库适配飞腾FT2000、鲲鹏920、龙芯3A5000国产ARM工控机适用于规模化奶牛场繁育室上位机改造。## 五、传统奶牛配种辅助工 vs 智能系统替代对照表| 配种辅助工日常岗位职责 | Qt智能繁育系统对应功能 || ---- | ---- || 每日早中晚三次巡栏观察奶牛爬跨、外阴粘液判断发情 | AI摄像头24h实时识别发情结合项圈活动量自动判定最佳配种窗口 || 手持RFID耳标阅读器逐头核对牛只编号、胎次、产犊记录 | 一键RFID读取自动调取该牛繁育周期数据 || 从液氮罐取出冻精、37℃水浴解冻、清点细管数量 | 远程控制恒温解冻槽冻精库存电子化管理自动统计消耗 || 清洗、消毒输精枪、长臂手套等全套授精器械 | 联动消毒设备一键启停记录消毒时长 || 监测液氮罐余量定期上报补液氮需求 | 实时液氮液位曲线低液位自动弹窗告警 || 配种后手写繁殖卡片记录配种时间、公牛冻精、发情情况 | SQLite数据库自动生成标准化台账随时查询导出 || 跟踪36/90/220天三次妊检结果标记空怀、流产 | 台账内置妊检阶段字段自动提醒复检时间 || 整理每日繁育报表、冻精出入库台账上报牧场 | 系统自动汇总数据表格可视化一键刷新 |## 七、硬件落地对接拓展1. RS485串口对接恒温解冻槽控制器、液氮液位传感器、消毒设备、RFID读卡器2. 工业摄像头替换代码内模拟帧cv::Mat frame读取/dev/video0实时画面接入YOLO奶牛爬跨行为推理模型3. 奶牛项圈传感器Modbus协议读取活动量、体温数据完善发情判定算法4. B超妊检设备可扩展串口对接自动同步妊检结果至繁育台账。