【qt结合opencv实现功能】在qt中实现连接视频设备并添加计时、开始、暂停、关闭、抓怕功能

2 篇文章 0 订阅
1 篇文章 0 订阅


前言


最近有个项目有个部分是要连接摄像机并把拍摄到的画面实时显示出来,于是我想到了用qt+opencv的方式正好可以实现。

一、项目配置

以下安装部署均是在windows上进行的

1.qt5.12按装教程:
2.opencv环境配置
3.cmake安装教程

二、显示效果

在这里插入图片描述


功能描述:

时间检测状态-开始检测状态-暂停检测状态-结束截取图片
点击开始后会开始计时,点击暂停时会停止计时点击开始时画面接入视频暂停,时间停止计时画面显示结束可以将截取到的截屏保存在本机储存

三、各部分功能代码:

3.1 开始展示画面

isStart=true开始播放,随后控制ui进行时间计时器开始工作,并且控制视频画面展示出来。

/// 开始
void MainWindow::on_pushButton1_2_clicked() {

        ui->scrollAreaSoftware->setEnabled(false);
        ui->scrollAreaSoftware->setStyleSheet("color:gray");
        ui->pushButtonSave->setEnabled(true);
        ui->pushButtonSave->setStyleSheet("color:rgb(46, 52, 54)");
        emit SetWorkMode(CONTINUE_MODE);

        isStart = true;
        timer->start(1);
        ui->start_pushButton->setEnabled(false);
        ui->stop_pushButton->setEnabled(true);
        ui->reset_pushButton->setEnabled(false);
        ui->pauseOrContinue_pushButton->setEnabled(true);

}

3.2 暂停展示画面

如果此时的isStart时true状态时,控制画面暂停显示,时间计时暂停不再计时,同时暂停按钮的样式变为“继续”,如果再按“继续”按钮时,此时的isStart的状态不是true,,转而启动计时器重新开始计时,画面重新开始展示。

/// 暂停
void MainWindow::on_pushButton1_clicked() {

        ui->scrollAreaSoftware->setEnabled(true);
        ui->scrollAreaSoftware->setStyleSheet("color:rgb(46, 52, 54)");
        ui->pushButtonSave->setEnabled(false);
        ui->pushButtonSave->setStyleSheet("color:gray");
        emit SetWorkMode(SOFTWARE_MODE);
        if(isStart == true)
        {
            timer->stop();
            ui->pushButton1->setText("继续");
            ui->start_pushButton->setEnabled(false);
            ui->stop_pushButton->setEnabled(false);
            ui->reset_pushButton->setEnabled(true);
            ui->pauseOrContinue_pushButton->setEnabled(true);

        }
        if(isStart == false)
        {
            timer->start(1);
            ui->pushButton1->setText("暂停");
            ui->start_pushButton->setEnabled(false);
            ui->stop_pushButton->setEnabled(true);
            ui->reset_pushButton->setEnabled(false);
            ui->pauseOrContinue_pushButton->setEnabled(true);
            ui->scrollAreaSoftware->setEnabled(false);
            ui->scrollAreaSoftware->setStyleSheet("color:gray");
            ui->pushButtonSave->setEnabled(true);
            ui->pushButtonSave->setStyleSheet("color:rgb(46, 52, 54)");
            emit SetWorkMode(CONTINUE_MODE);

        }
        isStart = !isStart;

}

3.3 结束画面展示

这个就比较简单了,直接关闭项目就完事了。

void MainWindow::on_pushButton1_3_clicked(bool checked) {

        this->close();

}

3.4 画面截取拍照保存

n_pushButtonTakepic_clicked函数是让mCameraThread开启,on_pushButtonSave_clicked函数是将图像保存到指定位置,on_pushButtonChoosePath_clicked函数是选择图片保存的地址。

/// 点击拍照按钮
void MainWindow::on_pushButtonTakepic_clicked() {
    mCameraThread->Start();
}

/// 保存图像到指定路径
void MainWindow::on_pushButtonSave_clicked() {
    QDateTime datetime = QDateTime::currentDateTime();
    QString time = datetime.toString("yyyy_MM_dd_hh_mm_ss_zzz");
    QString path = mPath + "/" + time + mImageSaveFormat;
    if(!mImage.save(path)) {
        QMessageBox::warning(nullptr, tr("保存错误"), tr("保存图像失败"));
        return ;
    }
    QMessageBox::information(nullptr, tr("成功"), tr("保存图像成功"));
}

/// 选择保存图像的地址

void MainWindow::on_pushButtonChoosePath_clicked() {
    mPath = QFileDialog::getExistingDirectory(this, tr("C:\\Users\\yangyaning\\Desktop\\document"), tr("./"));
    ui->lineEdit->clear();
    ui->lineEdit->setText(mPath);
}

/// JPG格式
void MainWindow::on_radioButtonJPG_clicked(bool checked) {
    if(checked) {
        mImageSaveFormat = QString(".jpg");
    }
}

/// BMP格式
void MainWindow::on_radioButtonBMP_clicked(bool checked) {
    if(checked) {
        mImageSaveFormat = QString(".bmp");
    }
}

/// PNG格式
void MainWindow::on_radioButtonPNG_clicked(bool checked) {
    if(checked) {
        mImageSaveFormat = QString(".png");
    }
}


/// 点击拍照按钮启动暂停
void CameraThread::Start() {
    if(THREAD_ISIDLE == mStatus) {
        mCount = RUNING_NUM;
        mWaitcondtion.wakeAll();
    }
}

/// 抓图线程接收工作模式信号
void CameraThread::RecvWorkMode(int workmode) {
    mStatus = THREAD_ISIDLE;
    mCount = PAUSING_NUM;
    if(SOFTWARE_MODE == mWorkMode && CONTINUE_MODE == workmode) {
        mWaitcondtion.wakeAll();
    }
    mWorkMode = workmode;
}

3.5 计时器功能的实现:

定时器
这部分功能是实现计时器的初始化:

ui->setupUi(this);
    isStart = false;
    timer = new QTimer;
    src_ms = 0;
    src_s = 0;
    src_m = 0;
    src_h = 0;
    reverseTime = 0;
    result = "00:00:00";

    ui->timeDisplay_lcdNumber->display("00:00:00");
    connect(timer,SIGNAL(timeout()),this,SLOT(updateTime()));
    ui->start_pushButton->setEnabled(true);
    ui->stop_pushButton->setEnabled(false);
    ui->reset_pushButton->setEnabled(false);
    ui->pauseOrContinue_pushButton->setEnabled(false);

updateTime函数是根据hour、minute、second、msecond的变化实时显示出计时器上的时间。
void MainWindow::updateTime()//更新时间显示
{
    src_ms++;
    QString hour,minute,second,msecond;

        if(src_ms >= 500)
        {
            src_s++;
            src_ms = 0;
        }
        if(src_s >= 60)
        {
            src_m++;
            src_s = 0;
        }
        if(src_m >= 60)
        {
            src_h++;
            src_m = 0;
        }
        hour = QString::number(src_h);
        minute = QString::number(src_m);
        second = QString::number(src_s);
        msecond = QString::number(src_ms);

    if(hour.length() == 1)
        hour = "0" + hour;
    if(minute.length() == 1)
        minute = "0" + minute;
    if(second.length() == 1)
        second = "0" + second;
    if(msecond.length() == 1)
        msecond = "00" + msecond;
    else if(msecond.length() == 2)
        msecond = "0" + msecond;
    result = hour + ":" + minute + ":" + second;
    ui->timeDisplay_lcdNumber->display(result);

}

四、mainwindow.h和pro文件的内容

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
#include <QLabel>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/core/mat.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/videoio.hpp>
namespace Ui {
class MainWindow;
}
/// 工作模式 连续采集/软件触发
enum {
    CONTINUE_MODE,
    SOFTWARE_MODE
};
/// 软件触发信号数字
enum {
    PAUSING_NUM,
    RUNING_NUM
};
/// 拍照模式 手动/自动
enum {
    MANUAL_MODE,
    AUTO_MODE
};
/// 抓图线程抓帧传输是否完成
enum {
    THREAD_ISIDLE,
    THREAD_ISRUNING
};
class CameraThread : public QThread
{
    Q_OBJECT
public:
    explicit CameraThread(int count = 0, int workmode = CONTINUE_MODE, bool isstop = false, int status = 0);
    ~CameraThread();
    void run();
    void Stop();
    void Pause();
    void Start();
signals:
    /// 抓到图像传送给ui界面显示
    void GrabFrame(cv::Mat frame, int grabfps);
private slots:
    void RecvWorkMode(int workmode);
    void ResetFpsSlot();
private:
    cv::Mat mFrame;
    bool mIsStop;
    int mWorkMode;
    int mCount;
    int mStatus;
    int mGrabFps;
    QWaitCondition mWaitcondtion;
    QMutex mMutex;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void closeEvent(QCloseEvent *event);
private slots:
    /// 接收抓图线程抓到的帧并显示
    void RecvFrame(cv::Mat mat, int grabfps);
    /// 触发模式选择
    void on_pushButton1_3_clicked(bool checked);
    void on_pushButton1_2_clicked(bool checked);
    void on_pushButton1_clicked(bool checked);
    /// 软件触发时点击拍照按钮
    void on_pushButtonTakepic_clicked();
    /// 保存图像到指定路径
    void on_pushButtonSave_clicked();
    /// 选择保存图像的地址
    void on_pushButtonChoosePath_clicked();
    /// 图像保存格式
    void on_radioButtonJPG_clicked(bool checked);
    void on_radioButtonBMP_clicked(bool checked);
    void on_radioButtonPNG_clicked(bool checked);
    /// Fps
    void UpDateFps();
    void on_start_pushButton_clicked();
    void on_stop_pushButton_clicked();
    void updateTime();
    void on_reset_pushButton_clicked();
    void on_pauseOrContinue_pushButton_clicked();
signals:
    void SetWorkMode(int workmode);
    void ResetGrabFps();
private:
    Ui::MainWindow *ui;
    CameraThread *mCameraThread;
    QString mPath;
    QImage mImage;
    QString mImageSaveFormat;
    QLabel *mLabelFps;
    int mReadFps;
    int mDisplayFps;
    QTimer *timer;
    int src_ms;
    int src_s;
    int src_m;
    int src_h;
    bool isStart;
    int reverseTime;
    QString hour,minute,second,msecond;
    int rhour,rminute,rsecond,rmsecond;
    QString result;
    QString recordedData;
};
#endif // MAINWINDOW_H

pro文件:
这里的地址是我本机的地址,请各位使用时不要照搬。

#-------------------------------------------------
#
# Project created by QtCreator 2019-10-29T09:10:23
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = OpencvCamera
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

INCLUDEPATH += E:\zaodianjiance\opencv\opencv\build\install\include\
               E:\zaodianjiance\opencv\opencv\build\install\include\opencv2\
               E:\zaodianjiance\opencv\opencv\build\install\include\opencv

LIBS += E:\zaodianjiance\opencv\opencv\build\install\x64\mingw\lib\libopencv_*.a



源码需要的可以私聊我。

码字不易~, 各位看官要是看爽了,可不可以三连走一波,点赞皆有好运!,不点赞也有哈哈哈~~~

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让子弹飞一会儿=>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值