基于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++;
}

效果图

背景建模

异物入侵

生成异物入侵的视频文件

基于QT的一个简易的安防

时间: 2024-10-10 06:59:17

基于QT的一个简易的安防的相关文章

基于二维码的自适应安防巡逻系统

本作品采用嵌入式系统技术,结合无人机和二维码,借助开源计算机视觉库Open CV和机器人操作系统ROS,实现了室内大型场所的自适应安防巡逻.硬件方面,设计了 Parrot ardrone 2.0无人机作为载体,Minnow Board Turbot主板作为嵌入式核心版的系统.软件方面,编写了无人机飞行控制和图像处理的程序,利用PID控制算法实现了无人机的飞行控制. 整个系统包含无人机.二维码和主板,无人机是直接巡逻的工具,二维码给定飞行路线,主板放置于大型场所的房顶来与无人机通信实现控制.系统的

C 基于UDP实现一个简易的聊天室

引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少很多. 但是水也很深. 本文就当是一个demo整合帮助开发者回顾和继续了解 linux udp开发的基本流程. 首先我们来看看 linux udp 和 tcp的异同. /* 这里简单比较一下TCP和UDP在编程实现上的一些区别: TCP流程 建立一个TCP连接需要三次握手,而断开一个TCP则需要四个

基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获取要绘制的字符的 Unicode 码,使用 FreeType 库获取对应的位图数据,添加到字符表中(后面同样的字符可以再表中直接索引),将字符表上的字符填充到一张纹理上.计算每个字符的纹理坐标,使用渲染器绘制 注意的问题: 对于中英文混合的字符串,使用 char 存储时,英文字符占 1 个字节,而中

基于OpenGL编写一个简易的2D渲染框架01——创建窗口

最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的是 vs2013,使用C++语言编写项目.这个小项目叫Simple2D,意味着简易的2D框架.最终的目的是可以渲染几何图形和图片,最后尝试加上一个2D粒子系统和Box2D物理引擎,并编译一个简单的游戏. 第一步,就是创建一个Win32项目. 接下来,生成一个窗口.编写一个RenderWindow类,

基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader

Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::createShaderProgram(const char* vsname, const char* psname) { std::string vShaderSource, fShaderSource; std::ifstream vShaderFile, fShaderFile; vShaderF

基于OpenGL编写一个简易的2D渲染框架-12 重构渲染器-BlockAllocator

BlockAllocator 的内存管理情况可以用下图表示 整体思路是,先分配一大块内存 Chunk,然后将 Chunk 分割成小块 Block.由于 Block 是链表的一个结点,所以可以通过链表的形式把未使用的 Block 连接起来,并保存到 pFreeLists 中.当我们向 BlockAllocator 申请一块内存时,BlockAllocator 会通过 pFreeLists 表索引出一块空闲的 Block,并返回其地址.当我们不断申请内存的时候,BlockAllocator 会不断返

基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求. 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式.所以同时渲染粒子系统和其他纹理时会得不到想要的结果,渲染器还存在许多的不足: 1.当渲染许多透明图形时,没有对其进行排序,使得本应透明的图形没有透明. 2.不能对不同的顶点使用不同的状态进行渲染. 渲染器要做的东西很简单,就是 1.传递数据到 GPU 2.设置 OpenGL 状态信息(Alpha测试.模板测试.深

基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: 要实现以上的功能,需要几个对象: 事件分派器:EventDispatcher,负责将 BaseEvent 分派给 EventListener 对象 事件监听器:EventListener,这只是一个接口类,接受 BaseEvent 的对象,真正的处理在它的子类中实现 事件:BaseEvent,储存

基于OpenGL编写一个简易的2D渲染框架-11 重构渲染器-Renderer

假如要渲染一个纯色矩形在窗口上,应该怎么做? 先确定顶点的格式,一个顶点应该包含位置信息 vec3 以及颜色信息 vec4,所以顶点的结构体定义可以这样: struct Vertex { Vec3 position; Vec4 color; }; 然后填充矩形四个顶点是数据信息: Vertex* data = ( Vertex* ) malloc(sizeof( Vertex ) * 4); data[0].position.set(0, 0, 0); data[1].position.set(