基于QT的一个简易的安防
工程描述
- opencv2.4.8
- 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的一个简易的安防的更多相关文章
- C 基于UDP实现一个简易的聊天室
引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...
- 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统
在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...
- 基于OpenGL编写一个简易的2D渲染框架-05 渲染文本
阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获 ...
- 基于OpenGL编写一个简易的2D渲染框架-01 创建窗口
最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的 ...
- 基于OpenGL编写一个简易的2D渲染框架-09 重构渲染器-Shader
Shader 只是进行一些简单的封装,主要功能: 1.编译着色程序 2.绑定 Uniform 数据 3.根据着色程序的顶点属性传递顶点数据到 GPU 着色程序的编译 GLuint Shader::cr ...
- 基于 Mysql 实现一个简易版搜索引擎
前言 前段时间,因为项目需求,需要根据关键词搜索聊天记录,这不就是一个搜索引擎的功能吗? 于是我第一时间想到的就是 ElasticSearch 分布式搜索引擎,但是由于一些原因,公司的服务器资源比较紧 ...
- 基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构
事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求. 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式.所以同时渲染粒 ...
- 基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件
这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: ...
- 基于OpenGL编写一个简易的2D渲染框架-04 绘制图片
阅读文章前需要了解的知识,纹理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 过程简述:利用 FreeI ...
随机推荐
- DB天气app冲刺第十二天
今天其实不算冲刺了 ,因为今天没怎么花时间在软件上,而是花时间在老师留的作业上了.所以也算作是软件工程这门课的冲刺吧. DB天气这款app上今天的api接口还是木有弄好.明天会继续弄.但是全国城市的数 ...
- sshj ,ssh , springmvc pom.xml
记录下项目中的 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...
- Flex 调用webService
今天手头没事,就学习下 Flex 调用webService的方法.本地测试OK 和大家分享下. ——————————————————————————————————————————————————— ...
- [转载]MongoDB设置访问权限、设置用户
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...
- OSharp框架总体设计
OSharp框架解说系列(1):总体设计 〇.前言 哈,距离前一个系列<MVC实用构架设计>的烂尾篇(2013年9月1日)已经跨了两个年头了,今天是2015年1月9日,日期已经相映,让我们 ...
- Vue.js vui 饿了么Vue2.0的组件库
http://www.oschina.net/news/78038/vue-js-2-0-3 http://git.oschina.net/durcframework/vui http://eleme ...
- Django用户认证系统(一)User对象
User对象 User对象是认证系统的核心.用户对象通常用来代表网站的用户,并支持例如访问控制.注册用户.关联创建者和内容等.在Django认证框架中只有一个用户类,例如超级用户('superuser ...
- “WIZnet杯”以太网技术竞赛即将开始!
- CSS和JavaScript以及Ajax实现预加载图片的方法及优缺点分析
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...
- Miles per gallon to kilometers per liter
Miles per gallon to kilometers per liter 1 Imperial Gallon = 4.54609188 litres 1 Mile = 1.609344 kil ...