基于OpenCV的实时图像采集与远程监控系统
班级: 0805 姓名: 杨学齐 学号: 200892128
一、系统介绍
1.1系统功能介绍
本系统是基于OpenCV的实时图像采集、远程监控系统,主要分为两个功能模块
实时图像采集:
实时图像采集利用了OpenCV来实现,利用OpenCV库在定时器的调节下,可以从摄
像头直接获取监控对象的图像。为了达到实时效果,必须保证帧频不能太低。实时采集另外一个重点是实时发送,采集到的图像必须实时发送到网络进行传输,因此采集线程和传输线程必须分为不同线程。
远程监控:
摄像头采集得到的图像是存储在本地的,必须通过网络的传输才可以实现远程监控,
由于视频数据量比较大,必须经过压缩后才能传输,本系统采用了Jpeg图像压缩,再通过高性能网卡将压缩后的图像传输出去。监控端接受到数据后,进行Jpeg解压缩后显示。
1.2系统架构介绍
图像采集端程序架构:
由于需要实时进行图像采集和传输,因此必须将图像采集和图像传输分为不同的线
程。
远程监控端程序架构:
监控端一方面进行网络数据接收,另外一方面必须将接收到的数据实时显示出来,也
必须采用多个线程。
1.3系统关键技术介绍
1.3.1 OpenCV
OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法
1.3.2 QT
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。
1.3.3 OpenCV帧与QT图像QImage之间的转化
QImage是Qt中的图像对象而IplImage是OpenCV中的对象,使用Qt和OpenCV必须进行两者之间的转化,主要是表示方法不同,位深及RGB之间的转换,这个部分是很重要
的,详细代码在下面已经列出。
1.3.4 Jpeg图像压缩与图像序列化QByteArray
直接把位图数据传输到网络会给整个网络带来很大的压力,有时网速不高,图像采集的速率虽然很高,但是远程监控端会因为网络原因收不到图像,因此对图像的数据量压缩是很有必要的。这里采用的是QT中Jpeg压缩,需要Jpeg库的支持。压缩之后的数据量大大减少了。
Socket发送的数据是没有对象的信息的QImage也不能直接被发送到远程监控端,必须序列化到QByteArray,这是一个字符流,将压缩后的图像对象序列化到QByteArray再进行传输。
1.3.5 Socket网络传输发送和接受
采用Socket直接进行网络传输,能够最大限度的压缩数据包的大小,控制校验图像的格式,图像采集端必须一边采集一边发送,这个同步进行的工作是通过线程来完成的,提供程序的效率。
另一方面远程监控端同样需要一边接收数据一边显示,也是通过多线程技术实现的,接收到的数据传递给显示线程,这需要将字符流QByteArray重新组装成一个QImage对象,然后显示出来。这个过程必须有准确的校验否则数据会显示不完整。
二、系统关键代码
2.1使用OpenCV库定时采集图像
int main(int argc, char *argv[]) {
CvCapture* camera = cvCreateCameraCapture(0); //建立OpenCV图像捕获对象
assert(camera);
IplImage * image=cvQueryFrame(camera); assert(image);
qDebug()<<\ depth=\<
qDebug()<<\ nChannels=\<
w.setWindowTitle(\);
w.show();
int return_value = a.exec();
cvReleaseCapture(&camera); //程序结束释放OpenCV图像捕获对象
return return_value; }
MainWindow::MainWindow(CvCapture *cam,QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this); this->camera = cam;
startTimer(100); //启动定时器,每100ms采集一次图像帧 this->p_thread = new ClientThread;
this->p_thread->moveToThread(this->p_thread);
QObject::connect(this,SIGNAL(signalImage(QByteArray)),this->p_thread,SLOT(doSendImage(QByteArray)));
this->p_thread->start();//启动图像传输线程 }
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, \); 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 (cvimage->nChannels) {
case 3:
if ( (cvimage->width != this->image.width()) || (cvimage->height != this->image.height()) ) {
this->image = QImage (cvimage->width, cvimage->height, QImage::Format_RGB32); }
cvIndex = 0; cvLineStart = 0;
for (int y = 0; y < cvimage->height; y++) {
unsigned char red,green,blue; cvIndex = cvLineStart;
for (int x = 0; x < cvimage->width; x++) {
red = cvimage->imageData[cvIndex+2]; green = cvimage->imageData[cvIndex+1]; blue = cvimage->imageData[cvIndex+0];
this->image.setPixel(x,y,qRgb(red, green, blue)); cvIndex += 3; }
cvLineStart += cvimage->widthStep; }
break; default:
qDebug()<<\ number of channels is not supported\\n\; break; }
break; default:
qDebug()<<\ type of IplImage is not implemented in QOpenCVWidget\\n\; break; }
ui->imagelable->setPixmap(QPixmap::fromImage(this->image)); }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于OpenCV的实时图像采集与远程监控系统在线全文阅读。
相关推荐: