文章目录
前言
最近有个项目有个部分是要连接摄像机并把拍摄到的画面实时显示出来,于是我想到了用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
源码需要的可以私聊我。
码字不易~, 各位看官要是看爽了,可不可以三连走一波,点赞皆有好运!,不点赞也有哈哈哈~~~