Qt OpenCV 学习(四):车道线检测

1. mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <opencv2/opencv.hpp>
#include <QString>
#include <QFileDialog>
#include <QTimer>
#include <QDebug>
#include <QLabel>

using namespace cv;
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void showFrame();

private slots:
    void on_btnOpen_clicked();

    void on_btnPlay_clicked();

private:
    Ui::MainWindow *ui;
    QLabel *infoLabel;
    VideoCapture videoCap;
    QTimer *videoTimer;
};
#endif // MAINWINDOW_H

2. mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);

    infoLabel = new QLabel();
    infoLabel->setMinimumWidth(200);
    this->statusBar()->addWidget(infoLabel);

    videoTimer = new QTimer();

    connect(videoTimer, &QTimer::timeout, this, &MainWindow::showFrame);
}

MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::showFrame() {
    Mat currentFrame;

    videoCap >> currentFrame;
    if (!currentFrame.empty()) {
        infoLabel->setText("video is playing");
        Mat gaussionFrame, grayFrame, cannyFrame;
        // 高斯变换
        GaussianBlur(currentFrame, gaussionFrame, Size(5, 5), 1, 0);
        // 灰度
        cvtColor(gaussionFrame, grayFrame, COLOR_BGR2GRAY);
        // canny 边缘检测
        Canny(grayFrame, cannyFrame, 50, 100);

        Mat resultFrame;
        Mat maskFrame = Mat::zeros(cannyFrame.size(), cannyFrame.type());

        vector<Point>polyPoints;
        polyPoints.push_back(Point(0, 368));
        polyPoints.push_back(Point(300, 210));
        polyPoints.push_back(Point(340, 210));
        polyPoints.push_back(Point(640, 368));

        fillPoly(maskFrame, vector<vector<Point>>{polyPoints}, Scalar(255, 255, 255));
        bitwise_and(cannyFrame, maskFrame, resultFrame);

        vector<Vec4i>lines;
        HoughLinesP(resultFrame, lines, 1, CV_PI / 180, 5, 40, 20);

        for (size_t i = 0; i < lines.size(); i++) {
            Vec4i carLine = lines[i];
            double lineSlope = (double(carLine[3]) - double(carLine[1])) / (double(carLine[2]) - double(carLine[0]));
            if (lineSlope > 0) {
                // 左车道线
                line(currentFrame, Point(carLine[0], carLine[1]), Point(carLine[2], carLine[3]), Scalar(0, 255, 255), 5, LINE_AA);
            } else if (lineSlope < 0) {
                // 右车道线
                line(currentFrame, Point(carLine[0], carLine[1]), Point(carLine[2], carLine[3]), Scalar(0, 255, 255), 5, LINE_AA);
            }
        }

        QImage showImg = QImage((const unsigned char*)(currentFrame.data), currentFrame.cols, currentFrame.rows, currentFrame.step, QImage::Format_RGB888);
        ui->labelPlay->setPixmap(QPixmap::fromImage(showImg.scaled(ui->labelPlay->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)));
    } else {
        infoLabel->setText("video is over");
        qDebug() << "video is over!";
        videoTimer->stop();
        videoCap.release();
    }
}

void MainWindow::on_btnOpen_clicked() {
    QString videoPath = QFileDialog::getOpenFileName(this, "open video", ".", "video(*.mp4 *.avi, *.flv); All files(*.*)");
    ui->lineEdit->setText(videoPath);
    infoLabel->setText("video is loaded");
}

void MainWindow::on_btnPlay_clicked() {
    ui->labelPlay->clear();
    QString videoPath = ui->lineEdit->text();
    videoCap.open(videoPath.toStdString());

    double rate = videoCap.get(CAP_PROP_FPS);
    double videoDelay = 1000 / rate;
    videoTimer->start(videoDelay);
}
相关推荐
罗罗攀1 小时前
PyTorch学习笔记|张量的广播和科学运算
人工智能·pytorch·笔记·python·学习
CDA数据分析师干货分享1 小时前
汉江师范学院数据科学与大数据技术专业大二学生:CDA一级学习经验
大数据·经验分享·学习·数据分析·cda证书·cda数据分析师
SuniaWang1 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题四:《Ollama 模型管理与调优:让 AI 模型在低配服务器上流畅运行》
人工智能·学习·spring
冰水不凉1 小时前
cartographer源码阅读四-MapBuilder
学习·slam
梦..2 小时前
Allegro学习记录(一)
arm开发·单片机·嵌入式硬件·学习·硬件架构·硬件工程·pcb工艺
Amazing_Cacao3 小时前
工艺师初级|参数与风味对齐(精品可可,精品巧克力)
笔记·学习
_饭团4 小时前
字符串函数全解析:12 种核心函数的使用与底层模拟实现
c语言·开发语言·学习·考研·面试·蓝桥杯
Larry_Yanan4 小时前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
芯跳加速4 小时前
AI 视频自动化学习日记 · 第三天
人工智能·学习·ai·自动化·音视频
小陈phd5 小时前
多模态大模型学习笔记(二十一)—— 基于 Scaling Law方法 的大模型训练算力估算与 GPU 资源配置
笔记·深度学习·学习·自然语言处理·transformer