基于Qt框架开发智能停车场管理系统

一、系统架构设计

1. 技术栈组成

技术模块 实现方案 功能说明
GUI框架 Qt 6.5 + Qt Designer 跨平台界面开发
数据库 MySQL 8.0 + Qt SQL模块 存储车辆/车位/交易记录
图像处理 OpenCV 4.7 + YOLOv5车牌检测模型 车牌识别与车位状态分析
通信协议 TCP/IP + JSON数据格式 多设备协同与云端同步
硬件接口 USB摄像头 + RFID读卡器 车辆信息采集

2. 系统架构图

graph TD A[用户终端] -->|HTTP/WebSocket| B[业务逻辑层] B --> C[数据库] B --> D[图像处理模块] D --> E[摄像头] C -->|SQL查询| F[车位状态] C -->|交易记录| G[计费模块]

二、核心功能实现

1. 车牌识别模块(OpenCV+YOLO)

// 车牌检测类定义
class LicensePlateDetector {
public:
    LicensePlateDetector();
    QString detectPlate(cv::Mat frame);

private:
    cv::dnn::Net net;
    void preprocessImage(cv::Mat &frame);
};

// 构造函数加载模型
LicensePlateDetector::LicensePlateDetector() {
    net = cv::dnn::readNetFromDarknet("yolov5.cfg", "yolov5.weights");
    net.setPreferableBackend(dnn::DNN_BACKEND_CUDA);
}

// 车牌识别流程
QString LicensePlateDetector::detectPlate(cv::Mat frame) {
    cv::Mat blob = cv::dnn::blobFromImage(frame, 1/255.0, cv::Size(640,640));
    net.setInput(blob);
    std::vector<cv::Mat> outs;
    net.forward(outs, getOutputNames());

    // 后处理:非极大值抑制
    std::vector<int> classIds;
    std::vector<float> confidences;
    std::vector<cv::Rect> boxes;
    postProcess(frame, outs, classIds, confidences, boxes);

    // 提取车牌区域并OCR识别
    if(!boxes.empty()) {
        cv::Mat plateImg = frame(boxes[0]);
        return tesseractOCR(plateImg); // 集成Tesseract OCR
    }
    return "";
}

2. 数据库设计(MySQL)

-- 车辆信息表
CREATE TABLE vehicles (
    plate_num VARCHAR(20) PRIMARY KEY,
    entry_time DATETIME,
    exit_time DATETIME,
    parking_fee DECIMAL(10,2),
    status ENUM('in', 'out') DEFAULT 'in'
);

-- 车位状态表
CREATE TABLE parking_spots (
    spot_id INT PRIMARY KEY,
    is_occupied BOOLEAN DEFAULT FALSE,
    reserved_by VARCHAR(20)
);

-- 交易记录表
CREATE TABLE transactions (
    record_id INT AUTO_INCREMENT PRIMARY KEY,
    plate_num VARCHAR(20),
    spot_id INT,
    start_time DATETIME,
    end_time DATETIME,
    amount DECIMAL(10,2)
);

3. 多线程处理架构

// 主线程负责GUI
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);

private slots:
    void onUpdateCameraFeed();  // 摄像头数据更新
    void onDatabaseConnected(); // 数据库连接状态

private:
    CameraThread *videoThread;  // 视频处理线程
    DatabaseManager *dbManager; // 数据库管理线程
};

// 视频处理线程
class CameraThread : public QThread {
    Q_OBJECT
protected:
    void run() override {
        cv::VideoCapture cap(0);
        while(!isInterruptionRequested()) {
            cv::Mat frame;
            cap >> frame;
            emit frameReady(frame); // 发送信号到主线程
            msleep(30);
        }
    }
signals:
    void frameReady(cv::Mat);
};

三、界面设计实现

1. 主监控界面(Qt Designer)

<!-- parking_main.ui -->
<widget class="QMainWindow" name="MainWindow">
    <property name="geometry">
        <rect>
            <x>0</x>
            <y>0</y>
            <width>1280</width>
            <height>720</height>
        </rect>
    </property>
    
    <widget class="QLabel" name="videoLabel">
        <property name="geometry">
            <rect>
                <x>10</x>
                <y>10</y>
                <width>960</width>
                <height>540</height>
            </rect>
        </property>
        <property name="alignment">
            <set>Qt::AlignCenter</set>
        </property>
    </widget>

    <widget class="QTableWidget" name="parkingTable">
        <property name="geometry">
            <rect>
                <x>980</x>
                <y>10</y>
                <width>280</width>
                <height>200</height>
            </rect>
        </property>
        <property name="columnCount">
            <number>3</number>
        </property>
        <property name="headerLabels">
            <QStringList>
                <string>车位编号</string>
                <string>状态</string>
                <string>车牌号</string>
            </QStringList>
        </property>
    </widget>
</widget>

2. 计费界面实现

// 计费对话框
class BillingDialog : public QDialog {
    Q_OBJECT
public:
    BillingDialog(QString plate, double hours, QWidget *parent = nullptr);

private:
    QLineEdit *plateEdit;
    QDoubleSpinBox *hourSpinBox;
    QPushButton *confirmBtn;

    void calculateTotal();
};

// 计费逻辑
void BillingDialog::calculateTotal() {
    QString plate = plateEdit->text();
    double hours = hourSpinBox->value();
    
    QSqlQuery query;
    query.prepare("SELECT entry_time FROM vehicles WHERE plate_num=:plate");
    query.bindValue(":plate", plate);
    query.exec();
    
    QDateTime entryTime = query.value(0).toDateTime();
    qint64 duration = QDateTime::currentSecsSinceEpoch() - entryTime.toSecsSinceEpoch();
    double total = hours * 5.0; // 5元/小时
    
    QMessageBox::information(this, "费用明细", 
        QString("车牌: %1\n停放时长: %2小时\n应付金额: %.2f元")
        .arg(plate).arg(hours).arg(total));
}

四、关键技术实现

1. 车位状态实时更新

// 使用定时器刷新车位状态
void MainWindow::updateParkingStatus() {
    QSqlQuery query("SELECT * FROM parking_spots");
    int row = 0;
    ui->parkingTable->clearContents();
    
    while(query.next()) {
        QTableWidgetItem *spotItem = new QTableWidgetItem(query.value(0).toString());
        QTableWidgetItem *statusItem = new QTableWidgetItem(
            query.value(1).toBool() ? "已占用" : "空闲");
        QTableWidgetItem *plateItem = new QTableWidgetItem(query.value(2).toString());
        
        ui->parkingTable->setItem(row, 0, spotItem);
        ui->parkingTable->setItem(row, 1, statusItem);
        ui->parkingTable->setItem(row, 2, plateItem);
        row++;
    }
}

2. 车辆进出控制逻辑

// 车辆入场处理
void MainWindow::handleVehicleEntry() {
    cv::Mat frame = videoThread->getCurrentFrame();
    QString plate = detector.detectPlate(frame);
    
    if(!plate.isEmpty()) {
        QSqlQuery query;
        query.prepare("INSERT INTO vehicles (plate_num, entry_time) VALUES (:plate, NOW())");
        query.bindValue(":plate", plate);
        query.exec();
        
        // 更新车位状态
        int spotId = findNearestAvailableSpot();
        if(spotId != -1) {
            query.prepare("UPDATE parking_spots SET is_occupied=1, reserved_by=:plate WHERE spot_id=:id");
            query.bindValue(":plate", plate);
            query.bindValue(":id", spotId);
            query.exec();
        }
    }
}

五、系统部署方案

1. 硬件配置建议

设备类型 推荐配置 功能说明
主控设备 工业级ARM处理器(如RK3588) 运行Qt程序+OpenCV处理
存储设备 128GB eMMC + 1TB SSD 数据库存储+日志文件
网络模块 双频WiFi + 4G LTE模块 远程监控+数据同步
电源管理 12V/5A工业电源 支持不间断供电

2. 部署流程

  1. 安装Ubuntu Server 22.04 LTS系统
  2. 配置MySQL数据库并导入初始数据
  3. 编译安装OpenCV 4.7 + CUDA支持
  4. 部署Qt应用程序(使用静态编译)
  5. 配置系统服务自动启动
  6. 设置防火墙规则开放必要端口

参考代码 QT实现停车场管理 www.youwenfan.com/contentcnk/70573.html

六、扩展功能建议

  1. 移动端集成 开发Android/iOS客户端,支持扫码支付和车位预约功能

  2. 大数据分析

    // 停车场使用率统计
    void generateUsageReport() {
        QSqlQuery query("SELECT DATE(entry_time) as date, COUNT(*) as entries FROM vehicles GROUP BY DATE(entry_time)");
        // 生成折线图/柱状图
    }
    
  3. 新能源车充电桩管理 增加充电桩状态监控模块,与车辆管理系统联动

  4. 应急处理机制

    // 火灾报警联动
    void onFireAlarmTriggered() {
        foreach(QSqlRecord record, QSqlDatabase::database().records("vehicles")) {
            if(record.value("spot_id").toInt() == FIRE_ZONE_SPOT) {
                sendEmergencySignal(record.value("plate_num").toString());
            }
        }
    }
    

七、测试方案

1. 压力测试

# 使用JMeter模拟1000辆车同时入场
jmeter -n -t parking_stress_test.jmx -l results.jtl

2. 功能测试用例

测试项 输入条件 预期结果
正常入场 有效车牌 数据库记录创建,车位状态变更
重复入场 相同车牌再次扫描 弹出警告提示
超时未出场 停留超过24小时 自动计算超时费用
网络中断 数据库连接丢失 启用本地缓存模式
posted @ 2025-10-30 16:22  yes_go  阅读(53)  评论(0)    收藏  举报