• 基于QT的一个简易的安防


    工程描述

    1. opencv2.4.8
    2. QT5

    背景建模后,当有异物入侵时,把入侵的帧写到视频文件

    使用BackgroundSubtractorMOG2背景建模

    程序基于QT对话框

    .pro

    #-------------------------------------------------
    #
    # Project created by QtCreator 2014-06-19T16:00:40
    # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = opencvqt TEMPLATE = app INCLUDEPATH += f:/opencv/build/include/opencv INCLUDEPATH += f:/opencv/build/include/opencv2 INCLUDEPATH += f:/opencv/build/include LIBS += -Lf:/opencv/build/x86/vc11/lib -lopencv_core248d -lopencv_highgui248d -lopencv_imgproc248d -lopencv_features2d248d -lopencv_calib3d248d -lopencv_contrib248d -lopencv_flann248d -lopencv_gpu248d -lopencv_legacy248d -lopencv_ml248d -lopencv_nonfree248d -lopencv_objdetect248d -lopencv_ocl248d -lopencv_photo248d -lopencv_stitching248d -lopencv_superres248d -lopencv_ts248d -lopencv_video248d -lopencv_videostab248d SOURCES += main.cpp dialog.cpp HEADERS += dialog.h FORMS += dialog.ui RESOURCES += img.qrc

    dialog.h

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    #include <QTimer>
    #include <QPixmap>
    #include <QDebug>
    #include <opencv/cv.h>
    #include <opencv/highgui.h>
    #include <opencv2/opencv.hpp>
    using namespace cv;
    namespace Ui {
    class Dialog;
    }
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
        void initwebcam();
        void initBackgroundSubtractorMOG2();
        Mat frame ;
    private slots:
        void getFrame(); //实现定时从摄像头取图并显示在label上的功能。
    
    private:
        VideoCapture cap; //highgui 里提供的一个专门处理摄像头图像的结构体
        cv::BackgroundSubtractorMOG2 bg;
        VideoWriter writer; //摄像头每次抓取的图像为一帧,使用该指针指向一帧图像的内存空间
        Size videoSize;
        Ui::Dialog *ui;
        QTimer *timer;                              /* 定时器,更新界面 */
    };
    
    #endif // DIALOG_H

    dialog.cpp

    #include "dialog.h"
    #include "ui_dialog.h"
    
    static bool recodeflag=false;
    static cv::Mat frame;
    static cv::Mat back;
    static cv::Mat fore;
    static Mat copyimg;
    static std::vector<std::vector<cv::Point> > contours;
    
    
    static int count=0;
    
    
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
        timer = new QTimer(this);
        initwebcam();
        initBackgroundSubtractorMOG2();
        connect(timer,SIGNAL(timeout()),this,SLOT(getFrame())); //超时就去取
        timer->start(5); //1000为1秒,10毫秒去取一帧
    
    
    
    }
    
    Dialog::~Dialog()
    {
        timer->stop(); //停止取帧
    
        delete ui;
    }
    
    void Dialog::initwebcam()
    {
        cap=VideoCapture(0);
        if(!cap.isOpened()){
    
            qDebug()<<"init webcam  error ,program exit...";
            return;
        }
        cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);      /* set width */
        cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);     /* set height */
    
        videoSize=Size(320,240);
    
    
    
    
    
    }
    
    void Dialog::initBackgroundSubtractorMOG2()
    {
        bg.setInt("nmixtures", 3);
        bg.setBool("detectShadows", false);
    
    
        writer.open("result.avi",CV_FOURCC('D','I','V','X'),15,videoSize);
    }
    
    void Dialog::getFrame(){
         //从摄像头取帧
    //    static  QPixmap pixmapObject(":/image/webcam.png");
    //    ui->label_3->setPixmap(pixmapObject);
    
        cap>>frame;
        frame.copyTo(copyimg);
        QImage image = QImage((const uchar*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped(); //简单地转换一下为Image对象,rgbSwapped是为了显示效果色彩好一些。
        ui->label->setPixmap(QPixmap::fromImage(image));
        bg.operator ()(frame,fore);
        bg.getBackgroundImage(back);
        cv::erode(fore,fore,cv::Mat());
        cv::dilate(fore,fore,cv::Mat());
        cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
        if (contours.size()>0 &&count>0)
                {
                    //如果轮廓的面积太小了也不用写到输出视频
                    for (int i = 0; i< contours.size(); i++)
                    {
                        double a=contourArea( contours[i],false);
                        if (a>500)//面积小于1000
                        {
                            cv::drawContours(frame,contours,i,cv::Scalar(0,0,255),2);
                            recodeflag=true;
                        }
                        else
                        {
                            recodeflag=false;
                        }
                    }
    
                }
                else
                {
                    recodeflag=false;
    
                }
        if(recodeflag){
            QImage imagelable2 = QImage((const uchar*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();
    
            ui->label_2->setPixmap(QPixmap::fromImage(imagelable2));
        }else {
            //static  QPixmap pixmapObject(":/image/webcam.png");
           // ui->label_2->setPixmap(pixmapObject);
            ui->label_2->setText("<h1><center><font color='red'>NOTHING</font></center></h1>");
    
        }
    
    
        if (recodeflag)
            {
                //std::string outfile(cv::format("%d.jpg",imagecount));
                //writer<<frame;
                writer<<copyimg;
                //imwrite(outfile,frame);
                //imagecount++;
            }
            count++;
    }

    效果图

    背景建模

    异物入侵

    生成异物入侵的视频文件

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Centeos7搭建selenium+Chrome浏览器
    数据结构学习篇之栈和队列
    数据结构学习篇之线性表
    Tornado基础学习篇
    Python控制函数运行时间
    python线程实现异步任务
    Python实现几种简单的排序算法
    python爬虫遇到会话存储sessionStorage
    Python 有哪些优雅的代码实现让自己的代码更pythonic?
    Ubuntu查看端口使用情况,使用netstat命令:
  • 原文地址:https://www.cnblogs.com/yuliyang/p/3798793.html
Copyright © 2020-2023  润新知