基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng)_第1頁
基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng)_第2頁
基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng)_第3頁
基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng)_第4頁
基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng) 作者: 日期:13 個人收集整理 勿做商業(yè)用途基于OpenCV的實時圖像采集與遠程監(jiān)控系統(tǒng)班級: 0805 姓名: 楊學齊 學號: 200892128 一、系統(tǒng)介紹1.1系統(tǒng)功能介紹本系統(tǒng)是基于OpenCV的實時圖像采集、遠程監(jiān)控系統(tǒng),主要分為兩個功能模塊實時圖像采集:實時圖像采集利用了OpenCV來實現(xiàn),利用OpenCV庫在定時器的調(diào)節(jié)下,可以從攝像頭直接獲取監(jiān)控對象的圖像。為了達到實時效果,必須保證幀頻不能太低。實時采集另外一個重點是實時發(fā)送,采集到的圖像必須實時發(fā)送到網(wǎng)絡進行傳輸,因此采集線程和傳輸線程必須分為不同線程.遠程監(jiān)控:攝像頭采集得

2、到的圖像是存儲在本地的,必須通過網(wǎng)絡的傳輸才可以實現(xiàn)遠程監(jiān)控,由于視頻數(shù)據(jù)量比較大,必須經(jīng)過壓縮后才能傳輸,本系統(tǒng)采用了Jpeg圖像壓縮,再通過高性能網(wǎng)卡將壓縮后的圖像傳輸出去。監(jiān)控端接受到數(shù)據(jù)后,進行Jpeg解壓縮后顯示。1.2系統(tǒng)架構介紹圖像采集端程序架構:由于需要實時進行圖像采集和傳輸,因此必須將圖像采集和圖像傳輸分為不同的線程.遠程監(jiān)控端程序架構:監(jiān)控端一方面進行網(wǎng)絡數(shù)據(jù)接收,另外一方面必須將接收到的數(shù)據(jù)實時顯示出來,也必須采用多個線程。1。3系統(tǒng)關鍵技術介紹1。3。1 OpenCV OpenCV是一個基于BSD許可證授權(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Wind

3、ows和Mac OS操作系統(tǒng)上。它輕量級而且高效由一系列 C 函數(shù)和少量 C+ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法1.3.2 QTQt是諾基亞開發(fā)的一個跨平臺的C+圖形用戶界面應用程序框架。它提供給應用程序開發(fā)者建立藝術級的圖形用戶界面所需的所用功能.Qt是完全面向?qū)ο蟮?很容易擴展,并且允許真正地組件編程?;旧?,Qt 同 X Window 上的 Motif,Openwin,GTK 等圖形界 面庫和 Windows 平臺上的 MFC,OWL,VCL,ATL 是同類型的東西,但Qt具有優(yōu)良的跨平臺特性、面向?qū)ο?、豐

4、富的API、大量的開發(fā)文檔等優(yōu)點。1。3。3 OpenCV幀與QT圖像QImage之間的轉(zhuǎn)化QImage是Qt中的圖像對象而IplImage是OpenCV中的對象,使用Qt和OpenCV必須進行兩者之間的轉(zhuǎn)化,主要是表示方法不同,位深及RGB之間的轉(zhuǎn)換,這個部分是很重要的,詳細代碼在下面已經(jīng)列出。1.3。4 Jpeg圖像壓縮與圖像序列化QByteArray直接把位圖數(shù)據(jù)傳輸?shù)骄W(wǎng)絡會給整個網(wǎng)絡帶來很大的壓力,有時網(wǎng)速不高,圖像采集的速率雖然很高,但是遠程監(jiān)控端會因為網(wǎng)絡原因收不到圖像,因此對圖像的數(shù)據(jù)量壓縮是很有必要的。這里采用的是QT中Jpeg壓縮,需要Jpeg庫的支持.壓縮之后的數(shù)據(jù)量大大減

5、少了.Socket發(fā)送的數(shù)據(jù)是沒有對象的信息的QImage也不能直接被發(fā)送到遠程監(jiān)控端,必須序列化到QByteArray,這是一個字符流,將壓縮后的圖像對象序列化到QByteArray再進行傳輸.1。3.5 Socket網(wǎng)絡傳輸發(fā)送和接受采用Socket直接進行網(wǎng)絡傳輸,能夠最大限度的壓縮數(shù)據(jù)包的大小,控制校驗圖像的格式,圖像采集端必須一邊采集一邊發(fā)送,這個同步進行的工作是通過線程來完成的,提供程序的效率。另一方面遠程監(jiān)控端同樣需要一邊接收數(shù)據(jù)一邊顯示,也是通過多線程技術實現(xiàn)的,接收到的數(shù)據(jù)傳遞給顯示線程,這需要將字符流QByteArray重新組裝成一個QImage對象,然后顯示出來.這個過程

6、必須有準確的校驗否則數(shù)據(jù)會顯示不完整。二、系統(tǒng)關鍵代碼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采集到的圖像轉(zhuǎn)化為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之間的轉(zhuǎn)化/該函數(shù)主要是根據(jù)OpenCV采集到的數(shù)據(jù)幀格式將其轉(zhuǎn)化為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());/將壓縮后的圖像發(fā)送2.4 通過Socket線程進行網(wǎng)絡傳輸#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發(fā)送圖像Image數(shù)據(jù) 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發(fā)送圖像Image數(shù)據(jù)void ClientThread::doSendImage

17、(QByteArray image_buf) if(NULL = this->p_socket) this>p_socket = new QTcpSocket(); this->p_socket>connectToHost(server_addr,11911); /注釋掉防止程序死循環(huán) /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); /重載父類虛函數(shù) 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); /發(fā)現(xiàn)新連接后,獲得相應的Socket thisp_socket = this-p_server->nextPendingConnection(); /等待連接建立 while(

21、this-p_socketstate()!=QAbstractSocket:ConnectedState); /連接建立后反復監(jiān)聽 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遠程監(jiān)控端圖像顯示#include "mainwindow。h"include

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論