工程描述

  1. opencv2.4.8
  2. QT5

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

使用BackgroundSubtractorMOG2背景建模

程序基于QT对话框

.pro

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator --19T16::40
    #
  4. #-------------------------------------------------
  5.  
  6. QT += core gui
  7.  
  8. greaterThan(QT_MAJOR_VERSION, ): QT += widgets
  9.  
  10. TARGET = opencvqt
  11. TEMPLATE = app
  12. INCLUDEPATH += f:/opencv/build/include/opencv
  13. INCLUDEPATH += f:/opencv/build/include/opencv2
  14. INCLUDEPATH += f:/opencv/build/include
  15.  
  16. LIBS += -Lf:/opencv/build/x86/vc11/lib \
  17. -lopencv_core248d \
  18. -lopencv_highgui248d \
  19. -lopencv_imgproc248d \
  20. -lopencv_features2d248d \
  21. -lopencv_calib3d248d \
  22. -lopencv_contrib248d \
  23. -lopencv_flann248d \
  24. -lopencv_gpu248d \
  25. -lopencv_legacy248d \
  26. -lopencv_ml248d \
  27. -lopencv_nonfree248d \
  28. -lopencv_objdetect248d \
  29. -lopencv_ocl248d \
  30. -lopencv_photo248d \
  31. -lopencv_stitching248d \
  32. -lopencv_superres248d \
  33. -lopencv_ts248d \
  34. -lopencv_video248d \
  35. -lopencv_videostab248d
  36.  
  37. SOURCES += main.cpp\
  38. dialog.cpp
  39.  
  40. HEADERS += dialog.h
  41.  
  42. FORMS += dialog.ui
  43.  
  44. RESOURCES += \
  45. img.qrc

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3.  
  4. #include <QDialog>
  5. #include <QTimer>
  6. #include <QPixmap>
  7. #include <QDebug>
  8. #include <opencv/cv.h>
  9. #include <opencv/highgui.h>
  10. #include <opencv2/opencv.hpp>
  11. using namespace cv;
  12. namespace Ui {
  13. class Dialog;
  14. }
  15.  
  16. class Dialog : public QDialog
  17. {
  18. Q_OBJECT
  19.  
  20. public:
  21. explicit Dialog(QWidget *parent = );
  22. ~Dialog();
  23. void initwebcam();
  24. void initBackgroundSubtractorMOG2();
  25. Mat frame ;
  26. private slots:
  27. void getFrame(); //实现定时从摄像头取图并显示在label上的功能。
  28.  
  29. private:
  30. VideoCapture cap; //highgui 里提供的一个专门处理摄像头图像的结构体
  31. cv::BackgroundSubtractorMOG2 bg;
  32. VideoWriter writer; //摄像头每次抓取的图像为一帧,使用该指针指向一帧图像的内存空间
  33. Size videoSize;
  34. Ui::Dialog *ui;
  35. QTimer *timer; /* 定时器,更新界面 */
  36. };
  37.  
  38. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3.  
  4. static bool recodeflag=false;
  5. static cv::Mat frame;
  6. static cv::Mat back;
  7. static cv::Mat fore;
  8. static Mat copyimg;
  9. static std::vector<std::vector<cv::Point> > contours;
  10.  
  11. static int count=;
  12.  
  13. Dialog::Dialog(QWidget *parent) :
  14. QDialog(parent),
  15. ui(new Ui::Dialog)
  16. {
  17. ui->setupUi(this);
  18. timer = new QTimer(this);
  19. initwebcam();
  20. initBackgroundSubtractorMOG2();
  21. connect(timer,SIGNAL(timeout()),this,SLOT(getFrame())); //超时就去取
  22. timer->start(); //1000为1秒,10毫秒去取一帧
  23.  
  24. }
  25.  
  26. Dialog::~Dialog()
  27. {
  28. timer->stop(); //停止取帧
  29.  
  30. delete ui;
  31. }
  32.  
  33. void Dialog::initwebcam()
  34. {
  35. cap=VideoCapture();
  36. if(!cap.isOpened()){
  37.  
  38. qDebug()<<"init webcam error ,program exit...";
  39. return;
  40. }
  41. cap.set(CV_CAP_PROP_FRAME_WIDTH, ); /* set width */
  42. cap.set(CV_CAP_PROP_FRAME_HEIGHT, ); /* set height */
  43.  
  44. videoSize=Size(,);
  45.  
  46. }
  47.  
  48. void Dialog::initBackgroundSubtractorMOG2()
  49. {
  50. bg.setInt("nmixtures", );
  51. bg.setBool("detectShadows", false);
  52.  
  53. writer.open("result.avi",CV_FOURCC('D','I','V','X'),,videoSize);
  54. }
  55.  
  56. void Dialog::getFrame(){
  57. //从摄像头取帧
  58. // static QPixmap pixmapObject(":/image/webcam.png");
  59. // ui->label_3->setPixmap(pixmapObject);
  60.  
  61. cap>>frame;
  62. frame.copyTo(copyimg);
  63. QImage image = QImage((const uchar*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped(); //简单地转换一下为Image对象,rgbSwapped是为了显示效果色彩好一些。
  64. ui->label->setPixmap(QPixmap::fromImage(image));
  65. bg.operator ()(frame,fore);
  66. bg.getBackgroundImage(back);
  67. cv::erode(fore,fore,cv::Mat());
  68. cv::dilate(fore,fore,cv::Mat());
  69. cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
  70. if (contours.size()> &&count>)
  71. {
  72. //如果轮廓的面积太小了也不用写到输出视频
  73. for (int i = ; i< contours.size(); i++)
  74. {
  75. double a=contourArea( contours[i],false);
  76. if (a>)//面积小于1000
  77. {
  78. cv::drawContours(frame,contours,i,cv::Scalar(,,),);
  79. recodeflag=true;
  80. }
  81. else
  82. {
  83. recodeflag=false;
  84. }
  85. }
  86.  
  87. }
  88. else
  89. {
  90. recodeflag=false;
  91.  
  92. }
  93. if(recodeflag){
  94. QImage imagelable2 = QImage((const uchar*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();
  95.  
  96. ui->label_2->setPixmap(QPixmap::fromImage(imagelable2));
  97. }else {
  98. //static QPixmap pixmapObject(":/image/webcam.png");
  99. // ui->label_2->setPixmap(pixmapObject);
  100. ui->label_2->setText("<h1><center><font color='red'>NOTHING</font></center></h1>");
  101.  
  102. }
  103.  
  104. if (recodeflag)
  105. {
  106. //std::string outfile(cv::format("%d.jpg",imagecount));
  107. //writer<<frame;
  108. writer<<copyimg;
  109. //imwrite(outfile,frame);
  110. //imagecount++;
  111. }
  112. count++;
  113. }

效果图

背景建模

异物入侵

生成异物入侵的视频文件

基于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. DB天气app冲刺第十二天

    今天其实不算冲刺了 ,因为今天没怎么花时间在软件上,而是花时间在老师留的作业上了.所以也算作是软件工程这门课的冲刺吧. DB天气这款app上今天的api接口还是木有弄好.明天会继续弄.但是全国城市的数 ...

  2. sshj ,ssh , springmvc pom.xml

    记录下项目中的 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  3. Flex 调用webService

    今天手头没事,就学习下 Flex 调用webService的方法.本地测试OK  和大家分享下. ——————————————————————————————————————————————————— ...

  4. [转载]MongoDB设置访问权限、设置用户

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...

  5. OSharp框架总体设计

    OSharp框架解说系列(1):总体设计 〇.前言 哈,距离前一个系列<MVC实用构架设计>的烂尾篇(2013年9月1日)已经跨了两个年头了,今天是2015年1月9日,日期已经相映,让我们 ...

  6. Vue.js vui 饿了么Vue2.0的组件库

    http://www.oschina.net/news/78038/vue-js-2-0-3 http://git.oschina.net/durcframework/vui http://eleme ...

  7. Django用户认证系统(一)User对象

    User对象 User对象是认证系统的核心.用户对象通常用来代表网站的用户,并支持例如访问控制.注册用户.关联创建者和内容等.在Django认证框架中只有一个用户类,例如超级用户('superuser ...

  8. “WIZnet杯”以太网技术竞赛即将开始!

  9. CSS和JavaScript以及Ajax实现预加载图片的方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...

  10. 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 ...