工程描述

  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. EF4.1之复杂类型

    首先我们生成两张对应表: public class Client { public int ClientID { set; get; } public string ClientName { set; ...

  2. Smarty格式化数字为INT数

    <? require("setup.php"); define('PAGETITLE','pagtitle'); function insert_top($lid,$sid) ...

  3. hdu 4681

    将c串从a,b串中删去后求最长公子列  直接暴会超时 #include <cstdio> #include <cstdlib> #include <algorithm&g ...

  4. the structure of the project (MVC)

    HTML <--- JSP <---- JS <---- Java controller <---- DAO <---- Database The JSP Model 2 ...

  5. POJ 2318 TOYS && POJ 2398 Toy Storage(几何)

    2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...

  6. NYOJ 题目15 括号匹配(二)(区间DP)

    点我看题目 题意 : 中文题不详述. 思路 : 本来以为只是个小模拟,没想到是个区间DP,还是对DP不了解. DP[i][j]代表着从字符串 i 位置到 j 位置需要的最小括号匹配. 所以初始化的DP ...

  7. windows中断与共享的连接(samba)

    问题:window下当成功登录到samba服务器上的共享的目录的时候,若要是再系想登录此服务器上另外一个共享目录时,会弹出登录窗口. 但是不管输入的用户名和密码对错都会提示. “不允许一个用户使用一个 ...

  8. 第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)

    在sql server数据库中,备份和还原都只能在服务器上进行,备份的数据文件在服务器上,还原的数据文件也只能在服务器上,当在非服务器的机器上启动sql server客户端的时候,也可以通过该客户端来 ...

  9. photoshop:模仿-广告放射背景

    模仿对象:图片大小960*400 过程: 1.新建文档,大小为:960*800 2.选择渐变工具,黑白从上往下渐变 3.滤镜->扭曲->波浪,参考设置 4.滤镜->扭曲->极坐 ...

  10. Android view的requestLayout()

    public void requestLayout () Since: API Level 1 Call this when something has changed which has inval ...