工程描述

  1. opencv2.4.8
  2. QT5

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

使用BackgroundSubtractorMOG2背景建模

程序基于QT对话框

.pro

#-------------------------------------------------
#
# Project created by QtCreator --19T16::40
#
#------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, ): 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 = );
~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=; 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(); //1000为1秒,10毫秒去取一帧 } Dialog::~Dialog()
{
timer->stop(); //停止取帧 delete ui;
} void Dialog::initwebcam()
{
cap=VideoCapture();
if(!cap.isOpened()){ qDebug()<<"init webcam error ,program exit...";
return;
}
cap.set(CV_CAP_PROP_FRAME_WIDTH, ); /* set width */
cap.set(CV_CAP_PROP_FRAME_HEIGHT, ); /* set height */ videoSize=Size(,); } void Dialog::initBackgroundSubtractorMOG2()
{
bg.setInt("nmixtures", );
bg.setBool("detectShadows", false); writer.open("result.avi",CV_FOURCC('D','I','V','X'),,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()> &&count>)
{
//如果轮廓的面积太小了也不用写到输出视频
for (int i = ; i< contours.size(); i++)
{
double a=contourArea( contours[i],false);
if (a>)//面积小于1000
{
cv::drawContours(frame,contours,i,cv::Scalar(,,),);
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的一个简易的安防的更多相关文章

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

    引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...

  2. 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统

    在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...

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

    阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获 ...

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

    最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的 ...

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

    Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ...

  6. 基于 Mysql 实现一个简易版搜索引擎

    前言 前段时间,因为项目需求,需要根据关键词搜索聊天记录,这不就是一个搜索引擎的功能吗? 于是我第一时间想到的就是 ElasticSearch 分布式搜索引擎,但是由于一些原因,公司的服务器资源比较紧 ...

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

    事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求. 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式.所以同时渲染粒 ...

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

    这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: ...

  9. 基于OpenGL编写一个简易的2D渲染框架-04 绘制图片

    阅读文章前需要了解的知识,纹理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 过程简述:利用 FreeI ...

随机推荐

  1. Oracle 常用操作

    修改数据库表名:rename [old-table] to [new-table]; while循环添加测试数据: declare     i int:=1;     begin     while ...

  2. execution 表达式

    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) th ...

  3. 手写快速排序(QuickSort)

    #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int ...

  4. protobuf 向前兼容向后兼容

    http://blog.163.com/jiang_tao_2010/blog/static/12112689020114305013458/ 不错的protobuf.. protobuf的编码方式: ...

  5. 贪心算法——将正整数变为1

    题目链接http://toutiao.com/a6320936270101528833/ 为避免链接失效,再粘贴一下题目内容: 给你一个数n,有3种操作: 1.这个数加1 2.这个数减1 3.如果这个 ...

  6. TIANKENG’s restaurant

    Problem B:http://codeforces.com/contest/616/problem/B B. Dinner with Emma 题意:一对夫妻要去餐厅吃晚饭,Emma 想去最豪华( ...

  7. efficient c++,单线程内存池

    基于 http://www.cnblogs.com/diegodu/p/4555018.html operator new的知识基础上 介绍这个章节的内容 对于一般直接 new 与delete 性能较 ...

  8. 关于CreadThread()与CloseHandle()

    今天看了点关于Windows多线程的东西,摘抄点关于CloseHandle的内容放于此,以便以后参考. 主要是<Windows核心编程>里的两小节: 3.1.1 内核对象的使用计数     ...

  9. CodeForces 279B Books

    http://codeforces.com/problemset/problem/279/B 题意 :Valera 有很多的空闲时间,所以他决定看书,给出n本书,编号1到n,和看每本书需要的时间,他看 ...

  10. Qt官网变更【2012】

    Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力,不仅断送了他的手机霸主地位,也耽误了Qt这两年的快速发展. 希望Digia能让Qt真正实现 run everywhere. 最近Qt的官 ...