基于OpenCV的实时图像采集与远程监控系统_第1页
基于OpenCV的实时图像采集与远程监控系统_第2页
基于OpenCV的实时图像采集与远程监控系统_第3页
基于OpenCV的实时图像采集与远程监控系统_第4页
基于OpenCV的实时图像采集与远程监控系统_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于OpenCV的实时图像采集与远程监控系统 作者: 日期:13 个人收集整理 勿做商业用途基于OpenCV的实时图像采集与远程监控系统班级: 0805 姓名: 杨学齐 学号: 200892128 一、系统介绍1.1系统功能介绍本系统是基于OpenCV的实时图像采集、远程监控系统,主要分为两个功能模块实时图像采集:实时图像采集利用了OpenCV来实现,利用OpenCV库在定时器的调节下,可以从摄像头直接获取监控对象的图像。为了达到实时效果,必须保证帧频不能太低。实时采集另外一个重点是实时发送,采集到的图像必须实时发送到网络进行传输,因此采集线程和传输线程必须分为不同线程.远程监控:摄像头采集得

2、到的图像是存储在本地的,必须通过网络的传输才可以实现远程监控,由于视频数据量比较大,必须经过压缩后才能传输,本系统采用了Jpeg图像压缩,再通过高性能网卡将压缩后的图像传输出去。监控端接受到数据后,进行Jpeg解压缩后显示。1.2系统架构介绍图像采集端程序架构:由于需要实时进行图像采集和传输,因此必须将图像采集和图像传输分为不同的线程.远程监控端程序架构:监控端一方面进行网络数据接收,另外一方面必须将接收到的数据实时显示出来,也必须采用多个线程。1。3系统关键技术介绍1。3。1 OpenCV OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Wind

3、ows和Mac OS操作系统上。它轻量级而且高效由一系列 C 函数和少量 C+ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法1.3.2 QTQt是诺基亚开发的一个跨平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰

4、富的API、大量的开发文档等优点。1。3。3 OpenCV帧与QT图像QImage之间的转化QImage是Qt中的图像对象而IplImage是OpenCV中的对象,使用Qt和OpenCV必须进行两者之间的转化,主要是表示方法不同,位深及RGB之间的转换,这个部分是很重要的,详细代码在下面已经列出。1.3。4 Jpeg图像压缩与图像序列化QByteArray直接把位图数据传输到网络会给整个网络带来很大的压力,有时网速不高,图像采集的速率虽然很高,但是远程监控端会因为网络原因收不到图像,因此对图像的数据量压缩是很有必要的。这里采用的是QT中Jpeg压缩,需要Jpeg库的支持.压缩之后的数据量大大减

5、少了.Socket发送的数据是没有对象的信息的QImage也不能直接被发送到远程监控端,必须序列化到QByteArray,这是一个字符流,将压缩后的图像对象序列化到QByteArray再进行传输.1。3.5 Socket网络传输发送和接受采用Socket直接进行网络传输,能够最大限度的压缩数据包的大小,控制校验图像的格式,图像采集端必须一边采集一边发送,这个同步进行的工作是通过线程来完成的,提供程序的效率。另一方面远程监控端同样需要一边接收数据一边显示,也是通过多线程技术实现的,接收到的数据传递给显示线程,这需要将字符流QByteArray重新组装成一个QImage对象,然后显示出来.这个过程

6、必须有准确的校验否则数据会显示不完整。二、系统关键代码2.1使用OpenCV库定时采集图像int main(int argc, char argv) CvCapture* camera = cvCreateCameraCapture(0); /建立OpenCV图像捕获对象 assert(camera); IplImage * image=cvQueryFrame(camera); assert(image); qDebug()<”Image depth=”<imagedepth<”n"; qDebug()<”Image nChannels="imag

7、e-nChannels<<"n”; QApplication a(argc, argv); MainWindow w(camera); w.setWindowTitle("VideoCapture”); w。show(); int return_value = a。exec(); cvReleaseCapture(&camera); /程序结束释放OpenCV图像捕获对象 return return_value;MainWindow::MainWindow(CvCapture cam,QWidget parent) : QMainWindow(paren

8、t), ui(new Ui:MainWindow) uisetupUi(this); this->camera = cam; startTimer(100); /启动定时器,每100ms采集一次图像帧 this->p_thread = new ClientThread; this-p_threadmoveToThread(thisp_thread); QObject:connect(this,SIGNAL(signalImage(QByteArray)),thisp_thread,SLOT(doSendImage(QByteArray))); this->p_threadst

9、art();/启动图像传输线程void MainWindow::timerEvent(QTimerEvent*) IplImage cvimage=cvQueryFrame(this->camera); this>setImage(cvimage); /将OpenCV采集到的图像转化为QImage并显示出来,以下是图像压缩和序列化,主要是为了图像传输 QByteArray byte_array; QBuffer buffer(byte_array); buffer.open(QIODevice:ReadWrite); this-image。save(buffer, ”JPG”);

10、this-signalImage(buffer。data();2.2 OpenCV帧与QT图像QImage之间的转化/该函数主要是根据OpenCV采集到的数据帧格式将其转化为QImage对象void MainWindow:setImage(IplImage cvimage) int cvIndex, cvLineStart; / switch between bit depths switch (cvimage->depth) case IPL_DEPTH_8U: switch (cvimagenChannels) case 3:if ( (cvimage>width != thi

11、s>image。width() | (cvimageheight != this->image.height() ) this>image = QImage (cvimagewidth, cvimage>height, QImage:Format_RGB32);cvIndex = 0; cvLineStart = 0;for (int y = 0; y cvimageheight; y+) unsigned char red,green,blue; cvIndex = cvLineStart; for (int x = 0; x < cvimage->wid

12、th; x+) red = cvimage-imageDatacvIndex+2; green = cvimageimageDatacvIndex+1; blue = cvimageimageDatacvIndex+0; this>image.setPixel(x,y,qRgb(red, green, blue); cvIndex += 3; cvLineStart += cvimage->widthStep; break; default: qDebug()<”This number of channels is not supportedn" break; br

13、eak; default: qDebug()<"This type of IplImage is not implemented in QOpenCVWidgetn”; break; uiimagelablesetPixmap(QPixmap:fromImage(thisimage));2.3 Jpeg图像压缩图像序列化QByteArray void MainWindow::timerEvent(QTimerEvent) IplImage cvimage=cvQueryFrame(this>camera); this->setImage(cvimage);

14、 QByteArray byte_array; /图像序列化为该QByteArray对象 QBuffer buffer(&byte_array); buffer。open(QIODevice:ReadWrite); /将图像进行压缩,使用了QT的JPG库 this->image。save(&buffer, ”JPG”);this->signalImage(buffer.data());/将压缩后的图像发送2.4 通过Socket线程进行网络传输#ifndef CLIENTTHREAD_Hdefine CLIENTTHREAD_H#include <QThrea

15、d>include QTcpSocketclass ClientThread : public QThread Q_OBJECTpublic: explicit ClientThread(QObject *parent = 0); ClientThread(); void run() thisexec(); private: QTcpSocket p_socket; const static QString server_addr;signals:public slots: /向Socket发送图像Image数据 void doSendImage(QByteArray image_buf

16、);;#endif / CLIENTTHREAD_Hinclude ”clientthread.h"const QString ClientThread::server_addr = "127。0。0。1"ClientThread:ClientThread(QObject parent) : QThread(parent) this>p_socket = NULL;ClientThread:ClientThread() delete this-p_socket;/向Socket发送图像Image数据void ClientThread::doSendImage

17、(QByteArray image_buf) if(NULL = this->p_socket) this>p_socket = new QTcpSocket(); this->p_socket>connectToHost(server_addr,11911); /注释掉防止程序死循环 /while(this-p_socket>state() != QAbstractSocket:ConnectedState); if(thisp_socket->state() != QAbstractSocket:ConnectedState) if(this->p

18、_socket-state() != QAbstractSocket:ConnectingState) this>p_socket->connectToHost(server_addr,11911); if(this>p_socket>state() = QAbstractSocket:ConnectedState) this>p_socketwrite(image_buf); ifndef SERVERTHREAD_Hdefine SERVERTHREAD_H#include QThread#include <QTcpServerinclude <Q

19、TcpSocketclass ServerThread : public QThread Q_OBJECTpublic: explicit ServerThread(QObject *parent = 0); /重载父类虚函数 void run();private: QTcpSocket p_socket; QTcpServer p_server;signals: void signalImage(QByteArray);public slots:;#endif / SERVERTHREAD_H#include "serverthread.h”ServerThread::Server

20、Thread(QObject *parent) : QThread(parent)void ServerThread::run() QByteArray buf; this>p_server=new QTcpServer(); thisp_serverlisten(QHostAddress:Any,11911); this>p_server->waitForNewConnection(-1); /发现新连接后,获得相应的Socket thisp_socket = this-p_server->nextPendingConnection(); /等待连接建立 while(

21、this-p_socketstate()!=QAbstractSocket:ConnectedState); /连接建立后反复监听 while(true) /保证连接没有在对方关闭的情况下 if(this->p_socket>state()=QAbstractSocket:ConnectedState) this->p_socketwaitForReadyRead(1); buf=thisp_socketreadAll(); this>signalImage(buf); else /关闭自己的连接并推出 this>p_socketclose(); exit(0); 2.5远程监控端图像显示#include "mainwindow。h"include

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论