首页 > 范文大全 > 正文

基于OpenCV与Socket的网络视频监控系统设计与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于OpenCV与Socket的网络视频监控系统设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要: 为了降低开发视频监控系统的成本与时间,提出一种新的、可行的网络视频监控系统方案。该系统使用OpenCV与Socket编程实现,采用的是客户机/服务器(C/S)模型。客户端请求进行视频监控并对视频流图像接收、显示;服务器端采用多进程编程满足多客户的监控请求并将采集到的视频图像以视频流的方式发送到客户端。实验结果表明该系统设计极大降低了视频监控系统的开发时间与开销。

关键词: OpenCV; Socket; 网络视频监控; 多进程编程

中图分类号: TN926?34; TP311 文献标识码: A 文章编号: 1004?373X(2017)02?0057?03

Abstract: To reduce the cost and shorten the time of developing video surveillance system, a innovative and feasible scheme of network video surveillance system is devised, in which OpenCV, Socket and client/server model are used. The client requests the video monitoring, and receives and displays the video stream images from server. The server fulfils the video monitoring requests from multiple clients by using multiprocess programming and transmits the captured video images to clients in the form of video stream. The system can dramatically reduce the cost and shorten the time of developing a video surveillance system.

Keywords: OpenCV; Socket; video surveillance; multiprocess programming

0 引 言

互联网高度发达的今天,网络视频监控系统正在以越来越快的速度进入日常的生活中。网络视频监控实质上就是将视频数据以网络协议的方式进行发送和接收,有可靠性高、低延迟、成本低廉等特点[1]。一般的网络视频监控系统是通过使用FFmpeg和VLC技术实现,使用OpenCV与Socket编程实现,为网络视频监控提供了一个新的、可行的方案。

1 OpenCV图像数据结构分析

OpenCV[1]是一个基于开源发行的跨平台的计算机视频库,它提供的接口极大方便了视频图像开发和节省开发时间。在opencv众多的函数库中,最重要的是IplImage结构体,非常多的图像是保存在IplImage结构体里面,结构体里面包含了众多相关的参数,只对重要的参数进行解析[2],如下:

typedef struct IplImage

{

int imageSize;

int depth;

...

...

...

int width;

int height;

char *imageData;

int widthStep;

}IplImage;

imageSize是图片整体大小的字节数;depth是图像的像素深度;width和height是图像的长度和宽度;widthStep是每一行图像数据的字节数;imageData是指向保存了图像数据的指针。因此,图像数据的传输就是要将imageData地址所保存的单元数据传输出去。

2 客舳松杓朴胧迪

基于客户端实现的功能,将客户端分为两个模块:接收视频流模块;实时显示视频流模块,并且单独为这两个模块编写多线程编程[3],提高执行效率,降低延迟[4?5]。

客户端软件设计流程如图1所示。

2.1 视频流接收与还原

借助socket的协议栈,可以将网络的数据保存在内核的缓存当中。调用Recv()函数,完成从内核空间到用户空间的拷贝。但是数据的拷贝工作,并不是一次性完成的,需要进行多次的拷贝工作,而且每次拷贝的大小也是不一致的[4?5]。视频流的接收如下:

for (i = 0; i < imgsize; i += byteRecv)

{

byteRecv = recv(socketfd, sockdata+i, imgsize-i, 0);

printf("recv ok \n");

}

接收到的视频流数据存到了足够大的数组当中,必须将图像数据按照IplImage图像封装的格式重新进行封装,图像数据的还原代码如下:

HANDLE handleRecv = CreateMutex(NULL, false, NULL);

for (i = 0, k = 0; i < img1?>height; i++)

{

for (j = 0; j < img1?>width; j++)

{

((uchar *)(img1?>imageData + i* img1?>widthStep))[j] = sockdata[k++];

}

}

is_data_ready = true;

ReleaseMutex(handleRecv);

}

为保证每次图像数据还原时,没有被其他的线程修改数据,所以使用信号锁进行锁住,当完成每一帧图像的还原之后就进行解锁。

2.2 视频显示

当判定一帧图像获取完毕之后,就对当前帧进行显示:

while (key_c != ′q′)

{

HANDLE recvMutex = CreateMutex(NULL, false, NULL);

if (is_data_ready)

{

cvShowImage("client", img1);

s_data_ready = false;

}

ReleaseMutex(recvMutex);

key_c = cvWaitKey(10);

}

为了保证在显示1帧图片时图片数据不被修改,在显示时就进行上锁处理,在完成一帧的显示时,就进行解锁。

3 服务器端设计与实现

服务器端响应客户端的请求,并将采集到的视频图像发送到客户端。将服务器端按功能分为两个模块:视频图像的采集;视频图像的发送。

这两个模块使用多线程编程,同时使用多进程编程实现多客户的实时监控[6]。

图2 服务器端流程图

3.1 视频图像的采集

使用OpenCV提供的接口完成摄像头视频图像的采集,为保证采集到图像的完整性,当采集的时候需要将完整的图像帧进行上锁,完成图像采集之后才进行释放,视频图像采集代码如下:

while(1) {

img0 = cvQueryFrame(Capture);

cvShowImage("show", img0);

pthread_mutex_lock(&mutex);

cvCvtColor(img0, img1,CV_BGR2GRAY);

is_data_ready = 1;

pthread_mutex_unlock(&mutex);

cvWaitKey(10); }

3.2 视频图像的发送

分析OpenCV的结构可知,将一帧图像的imageData所指向的内存单元保存的就是图像的数据,所以只要发送imageData部分就可以完成图像的传输;图像传输的同时,也要进行互斥锁,保证每一帧的图像完整l送,视频图像发送的代码如下:

while(1)

{

pthread_mutex_lock(&mutex);

if ( is_data_ready == 1 )

{

byteSend = send(iSocketClient, img1?>imageData, imgSize, 0);

is_data_ready = 0;

} pthread_mutex_unlock(&mutex);

}

将获取到的视频监控图像实时显示,并与发送端的图像进行比对,如图3所示。

4 结 语

使用OpenCV和Socket技术实现的网络视频监控系统,极大降低了开发时间和开销,为网络视频监控系统的开发提供了另一种方案。系统借鉴C/S[7]模型设计,满足多客户监控请求,经过严格测试,系统运行稳定、效果良好。但是,还存在只能传输灰白视频视频的问题,下一步将继续进行研究解决。

参考文献

[1] 杨宏,张志文.基于Web的嵌入式远程监控系统的研究与实现[J].计算机与数字工程,2012(10):70?72.

[2] 郭晖,陈光.基于OpenCV的视频图像处理应用研究[J].微型机与应用,2010(21):14?16.

[3] 席永光,付成伟.基于Socket通信的多电源管理系统[J].现代电子技术,2015,38(20):137?139.

[4] 童永清.Linux C编程实战[M].北京:人民邮电出版社,2008.

[5] STEVENS W. Richard, RAGO Stephen A. UNIX环境高级编程[M].3版.北京:人民邮电出版社,2014.

[6] 乔荣爱,李相海.基于嵌入式Linux平台的多路视频监控系统的设计与实现[J].计算机与数字工程,2015(7):1360?1364.

[7] 刘意先,邹鹏.基于局域网的视频监控系统的设计与实现[J].现代电子技术,2014,37(8):35?37.

[8] 于仕琪,刘瑞祯.学习OpenCV[M].北京:清华大学出版社,2009.

[9] 韦东山.Linux应用开发完全手册[M].北京:人民邮电出版社,2008.