工程描述

  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. 一个有意思的js实例,你会吗??[原创]

    首先,看看下面一个js例子,你觉得会输出什么呢? function fn(a){ a(); function a(){ console.log(2); } var a = function(){ co ...

  2. sql之解决数据库表的循环依赖问题

    三张数据表关系如图: 其实出现表循环依赖情况:就是 同时  ConfigCompany和 Department 也有依赖,就会报错,说有循环依赖,就会报错. 所以 这个时候的解决办法:可以改 在数据库 ...

  3. $.post()返回数据正常,但不执行success回调函数

    今天遇到一特郁闷的问题,如题:$.post()返回数据正常,但不执行success回调函数.说它郁闷是因为没毕业之前就遇到过解决了,却没有记录下来,导致卡了一下午. 像这样,post返回数据正常,但却 ...

  4. 通过注册表查找oracle_home的位置

    运行regedit进入注册表 ctrl+f查找oracle_home

  5. json2.js使用参考

    json2.js的源码地址: https://github.com/douglascrockford/JSON-js Visual Studio用户可以直接通过Nuget来获得. json2.js提供 ...

  6. Socat

    http://www.oschina.net/p/socat/ tcpick https://sourceforge.net/projects/tcpick/

  7. thinkphp多表关联并且分页

    $db_prefix = C('DB_PREFIX'); $Model = new Model(); $data = $Model->table("{$db_prefix}ordern ...

  8. jquery.cookie.js使用介绍

    Cookies概述: Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非 ...

  9. POJ2109——Power of Cryptography

    Power of Cryptography DescriptionCurrent work in cryptography involves (among other things) large pr ...

  10. 搜索引擎spam

    什么是SPAM?搜索引擎优化中的SPAM 在搜索引擎优化相关的文章中中经常遇到“SPAM”一词,SPAM通常用来指垃圾邮件,不过在搜索引擎营销中所说的SPAM是专门针对那些欺骗搜索引擎的信息.搜索引擎 ...