做了一个摄像头监控的项目
环境:qtcreator-2.5.2+Qt4.7.3+MinGW+openCV2.1(装在c盘根目录下,在项目中引入的时候有用)
功能介绍:监控笔记本摄像头,通过opencv的函数打开摄像头,用帧差分算法判断监控的区域有没有发生变化,也就是有没有物体进入监控区域,当监控的区域发生变化时,将这一帧发送给服务器端
之前环境不允许,一直用一台电脑既当服务器又当客户端,挺成功的,结果两台机子运行的时候就出错了,坑爹,后来身边没有别的机子有做这个项目的环境,所以一直没有找到为什么两台机子运行时出错的原因,今天改了改代码,不知道现在能不能成功,代码写的不规范,见谅,运行的时候内存飕飕往上升,一看就是空间没有回收,希望大家能够指出不对的地方,谢谢
目录结构:
在qtCalv2.pro中添加
QT += core gui
QT += network
INCLUDEPATH += C:\OpenCV2.1\include\opencv
LIBS += C:\OpenCV2.1\lib\highgui210.lib \
C:\OpenCV2.1\lib\cxcore210.lib \
C:\OpenCV2.1\lib\cv210.lib
添加opencv库,因为涉及到网络所以加上
QT += network
main.cpp中添加
#include<QTextCodec>
main函数中添加
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <cv.h>
#include <highgui.h>
#include <QImage>
#include <QTimer>
#include <QtGui>
#include <QEvent>
#include <QAbstractSocket>
#include <QTcpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void closeEvent(QCloseEvent * e);
private slots:
void openCamara(); // 打开摄像头
void readFrame(); // 读取当前帧信息
void closeCamara(); // 关闭摄像头
/*
author:xuxuan
description:初始化tcp数据
date:2014-2-18 15:27
*/
void send();
void startTransfer();
void updateClientProgress(qint64);
void displayError(QAbstractSocket::SocketError);
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTimer *timer;
QImage *imag;
CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
IplImage *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
IplImage *frImg; //保存当前张图片
IplImage *bkImg; //保存前一张图片
CvMat *frameMat; //当前帧mat
CvMat *frMat; //当前帧减去前一帧
CvMat *bkMat; //前一帧mat
int whiteNum; //frMat中白点的个数
int frameNum; //第几帧
/*
author:xuxuan
description:初始化tcp数据
date:2014-2-18 15:27
*/
QTcpSocket *tcpClient;
qint64 totalBytes; // 发送数据的总大小
qint64 bytesWritten; // 已经发送数据大小
qint64 bytesToWrite; // 剩余数据大小
qint64 payloadSize; // 每次发送数据的大小
QByteArray outBlock; // 数据缓冲区,即存放每次要发送的数据块
QBuffer buffer;