博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于QT的一个简易的安防
阅读量:6126 次
发布时间:2019-06-21

本文共 4707 字,大约阅读时间需要 15 分钟。

工程描述

  1. opencv2.4.8
  2. QT5

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

使用BackgroundSubtractorMOG2背景建模

程序基于QT对话框

.pro

#-------------------------------------------------## Project created by QtCreator 2014-06-19T16:00:40 ##-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = opencvqtTEMPLATE = appINCLUDEPATH += f:/opencv/build/include/opencvINCLUDEPATH += f:/opencv/build/include/opencv2INCLUDEPATH += f:/opencv/build/includeLIBS += -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_videostab248dSOURCES += main.cpp\        dialog.cppHEADERS  += dialog.hFORMS    += dialog.uiRESOURCES += \    img.qrc

dialog.h

#ifndef DIALOG_H#define DIALOG_H#include 
#include
#include
#include
#include
#include
#include
using namespace cv;namespace Ui {class Dialog;}class Dialog : public QDialog{ Q_OBJECTpublic: explicit Dialog(QWidget *parent = 0); ~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
> contours;static int count=0;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(5); //1000为1秒,10毫秒去取一帧}Dialog::~Dialog(){ timer->stop(); //停止取帧 delete ui;}void Dialog::initwebcam(){ cap=VideoCapture(0); if(!cap.isOpened()){ qDebug()<<"init webcam error ,program exit..."; return; } cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); /* set width */ cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240); /* set height */ videoSize=Size(320,240);}void Dialog::initBackgroundSubtractorMOG2(){ bg.setInt("nmixtures", 3); bg.setBool("detectShadows", false); writer.open("result.avi",CV_FOURCC('D','I','V','X'),15,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()>0 &&count>0) { //如果轮廓的面积太小了也不用写到输出视频 for (int i = 0; i< contours.size(); i++) { double a=contourArea( contours[i],false); if (a>500)//面积小于1000 { cv::drawContours(frame,contours,i,cv::Scalar(0,0,255),2); 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("

NOTHING

"); } if (recodeflag) { //std::string outfile(cv::format("%d.jpg",imagecount)); //writer<

效果图

背景建模

 

异物入侵

生成异物入侵的视频文件

 

转载于:https://www.cnblogs.com/yuliyang/p/3798793.html

你可能感兴趣的文章
must implement java.io.Serializable hessian
查看>>
Microsoft Licenses Flash Lite for Windows Mobile Users
查看>>
HDOJ 2020 绝对值排序
查看>>
HDOJ/HDU 2560 Buildings(嗯~水题)
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
[20170628]12C ORA-54032.txt
查看>>
除以2
查看>>
高可用集群原理解析
查看>>
Nginx配置URL转向tomcat
查看>>
极客Web前端开发资源大荟萃#001
查看>>
让div固定在某个位置
查看>>
Java开发环境Docker镜像
查看>>
从无到有,WebService Apache Axis2初步实践
查看>>
任务调度(一)——jdk自带的Timer
查看>>
UIKit框架(15)PCH头文件
查看>>
整理看到的好的文档
查看>>
Linux磁盘管理和文件系统管理
查看>>
linux运维人员的成功面试总结案例分享
查看>>
Windows DHCP Server基于MAC地址过滤客户端请求实现IP地址的分配
查看>>