您当前的位置:首页 > 计算机 > 编程开发 > Qt

QT+OPENCV实现监控

时间:04-20来源:作者:点击数:
城东书院 www.cdsy.xyz

QT+OPENCV实现监控

mianwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <opencv2/videoio.hpp>
#include <QTimer>
#include <opencv2/opencv.hpp>
# include <QDate>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    void get_camera_hash();
    ~MainWindow();
 
private slots:
    void on_startButton_clicked();
    void importFrame();
    void on_stopButton_clicked();
    void choose_video_dir();
    void choose_camera();
    void saveVideo();
 
private:
    Ui::MainWindow *ui;
    cv::VideoCapture cap;
    QTimer *timer;
    QTimer *timer2;
    cv::Mat frame;
    cv::VideoWriter write;
    int counter=0;
    int video_width=0;
    int video_height=0;
    int deviceID = 0;
    QString file_name = QDate::currentDate().toString("yyyy-MM-dd") + ".avi";
    QString file_path = QString("./%1_%2").arg(deviceID).arg(file_name);
    bool flag=false;
    QHash<int, QString> camera_hash;
 
};
#endif // MAINWINDOW_H

mianwindow.cpp

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <QFileDialog>
#include <QCameraDevice>
#include <QMediaDevices>
#include "mainwindow.h"
#include "./ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QRect rect =  ui->video_label->geometry();
    video_width = rect.width();
    video_height = rect.height();
    this->get_camera_hash();
    timer = new QTimer(this);
    timer2 = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(importFrame()));
    connect(timer2, SIGNAL(timeout()), this, SLOT(saveVideo()));
    connect(ui->action, SIGNAL(triggered()), this, SLOT(choose_video_dir()));
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
void MainWindow::on_startButton_clicked()
{
    cap.open(deviceID);
    flag = true;
    timer->start(30);
    timer2->start(30);
}
 
 
void MainWindow::on_stopButton_clicked()
{
    flag = false;
    cap.release(); //释放相机捕获对象
    timer->stop();
    timer2->stop();
    ui->video_label->clear();
    write.release();
 
}
 
void MainWindow::importFrame()
{
    counter++;
    cap >> frame;
    cv::flip(frame,frame,180);
    cvtColor(frame, frame, cv::COLOR_BGR2RGB);             //only RGB of Qt
    QImage srcQImage = QImage((uchar*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888);
    ui->video_label->setPixmap(QPixmap::fromImage(srcQImage));
    ui->video_label->show();
 
}
 
void MainWindow::choose_video_dir(){
    QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
    if (!dir.isEmpty()){
        file_path = QString("%1/%2_%3").arg(dir).arg(deviceID).arg(file_name);
    }
}
 
 
void MainWindow::saveVideo(){
    int fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
    double fps = 30.0;
    cv::Size frameSize(640, 480);
    write.open(file_path.toStdString(), fourcc, fps, frameSize, true);
    if (!cap.isOpened()) {
        cap.open(deviceID);
    }
 
    cv::Mat frame;
    while (flag) {
        cap >> frame;
        if (!frame.empty()) {
            write.write(frame);
        }
        qApp->processEvents();
    }
}
 
 
void MainWindow::choose_camera(){
    QHash<QString,QVariant> data = qobject_cast<QAction*>(sender())->data().toHash();
    int index = data.find("index")->toInt();
    deviceID = index;
}
 
void MainWindow::get_camera_hash(){
    QList<QAction *> childActionList;
    QMenu *childMenu = new QMenu();
    const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
    for(int i=0;i<cameras.size();i++){
        QString description = cameras[i].description();
        camera_hash.insert(i,description);
        QAction *child_camera_action = new QAction(childMenu);
        child_camera_action->setText(description);
        QHash<QString, QVariant> item;
        item.insert("index",i);
        item.insert("desc",description);
        QVariant variant(item);
        child_camera_action->setData(variant);
        connect(child_camera_action,SIGNAL(triggered()), this, SLOT(choose_camera()));
        childActionList<<child_camera_action;
    }
    childMenu->addActions(childActionList);
    ui->camera_action->setMenu(childMenu);
}

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>10</y>
      <width>68</width>
      <height>22</height>
     </rect>
    </property>
    <property name="text">
     <string>实时动画</string>
    </property>
   </widget>
   <widget class="QPushButton" name="startButton">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>500</y>
      <width>92</width>
      <height>31</height>
     </rect>
    </property>
    <property name="text">
     <string>开启摄像头</string>
    </property>
   </widget>
   <widget class="QLabel" name="video_label">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>40</y>
      <width>751</width>
      <height>441</height>
     </rect>
    </property>
    <property name="text">
     <string/>
    </property>
   </widget>
   <widget class="QPushButton" name="stopButton">
    <property name="geometry">
     <rect>
      <x>680</x>
      <y>500</y>
      <width>92</width>
      <height>31</height>
     </rect>
    </property>
    <property name="text">
     <string>关闭摄像头</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>27</height>
    </rect>
   </property>
   <widget class="QMenu" name="menu">
    <property name="title">
     <string>配置</string>
    </property>
    <addaction name="action"/>
    <addaction name="camera_action"/>
   </widget>
   <addaction name="menu"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
  <action name="action">
   <property name="text">
    <string>设置视频存放路径</string>
   </property>
  </action>
  <action name="camera_action">
   <property name="text">
    <string>设置摄像头</string>
   </property>
  </action>
 </widget>
 <resources/>
 <connections/>
</ui>

main.cpp

#include "mainwindow.h"
 
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

 

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐