开篇:润墨网以专业的文秘视角,为您筛选了一篇基于Linux的嵌入式视频监控系统应用软件设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要 本文介绍了基于S3C2410硬件平台和嵌入式linux的视频监控系统结构。阐述系统的软件结构、功能和控制流。对视频采集、压缩和显示的实现进行了分析,并对服务器端和客户端关键多线程的设计给出了实现方法。
中图分类号 TP311文献标识码 A文章编号 1674-6708(2010)18-0132-02
0 引言
视频监控直观、准确、及时,并且信息内容丰富,所以被广泛应用于许多场合,在公共安全、突发事件处理等领域发挥重要作用。随着网络、通信、多媒体、嵌入式技术的发展,嵌入式视频监控系统以其体积小、重量轻、数字化、功耗低、价格低廉等特点,正日益受到人们的重视。
本文中提及的嵌入式视频监控系统基于S3C2410X硬件平台,和2.4内核以上的Linux操作系统。采用USB摄像头进行图像采集,对获取的数字化监测画面进行现场智能处理和判断。图像不必总是传回监控中心。而是一旦判断发现异常,则可立即通过网络向检测中心报警,并传回异常画面。
1 嵌入式视频监控系统组成
系统主要由硬件和软件两部分组成。结构如图1所示。
本系统硬件选用致远公司的MagicARM2410作为嵌入式网络视频服务器的开发平台,选用USB摄像头来进行视频采集。MagicARM2410以基于ARM920T内核的S3C2410X芯片为MPU。该芯片内部集成了指令/数据Cache、3路UART、并行I/O口,且通过以太网控制芯片扩展一个以太网接口,同时引出USB主口,用来接USB 摄像头。
软件系统由系统软件和应用软件组成。前者主要是指经过剪裁并移植的Linux,内含USB内核驱动程序、USB主机控制器驱动、USB摄像头驱动等;后者包括自行开发的服务器端软件和客户端软件。
其中,服务器端模块负责视频采集、压缩、检测、报警、传输、显示等,而客户端模块则负责视频接收、解压、显示、存储等。
2 软件功能概述
服务器端的视频采集功能利用Video4Linx(V4L)来实现;视频压缩采用JPEG压缩算法;视频检测则是将JPEG图像转换为三通道的图像。
视频显示则利用了Framebuffer技术。Framebuffer是从Linux内核2.2开始引入的一种驱动程序接口。它本身不具备任何运算数据的能力,就像是一个暂时存放水的水池。CPU将运算结果放到这个水池,水池再将结果流到显示器。中间不会对数据做处理。应用程序可以直接读写这个水池的内容。
本文中提及的监测系统视频传输通过有线网络进行,采用TCP协议。也可以采用UDP协议,只是需要对相应程序做出修改。
3 应用软件功能实现
3.1 服务器端
服务器端应用程序的核心是两个线程:视频采集线程和视频发送线程。
视频数据采集用于完成对视频的实时采集和压缩功能。采用Video4Linux(V4L)技术。V4L是 Linux内核中支持影像设备的一组APIs。应用程序通过标准的系统调用即可操纵视频设备。
应用程序main函数分别判断网络和视频缓冲区初始化是否完成,之后即调用start()函数开始下列工作:
1)创建线程
thread_create();
2)视频采集初始化
init_framebuffer(FB_FILE, fv, tempbuf); // 视频缓冲区初始化
……
open_video(V4L_FILE, fv, // 打开并初始化摄像头
DEFAULT_DEPTH,
DEFAULT_PALETTE,
WIDTH, HEIGHT);
3)线程1进行视频采集和压缩
while(1){
……
rgb_to_framebuffer(fv, WIDTH, HEIGHT, // 视频图像存入缓冲区
XOFFSET, YOFFSET, image);
……
put_image_jpeg(fptr_jpg, (char *)image, // 图像压缩
WIDTH, HEIGHT,
DEFAULT_QUALITY,
DEFAULT_PALETTE);
}
4)线程2进行视频发送
while(1){
……
memset(sendbuff, 0, FILE_LENGTH); // 开辟发送缓冲区
num = read(file, sendbuff, FILE_LENGTH); // 读取图像文件大小
……
ret = send(temp_socketfd, sendbuff, ret, 0); // 发送并返回标志,以便判断是否成功
……
}
3.2 客户端
客户端应用程序的核心也是两个线程:接收线程与显示线程。采用前述的Framebuffer技术。类似地,main函数会调用start()函数开始下列工作:
1)创建线程(同前)
2)视频接收初始化
ret = client(IP); // 判断网络连接是否成功
…
fb_open(fb_device, &fb_width, // 打开视频缓冲区以备图像数据接收
&fb_height, &fb_depth);
3)线程1接收视频
while(1) {
++bianhao; // 给视频图像编号
……
strcat(filename,".jpg"); // 确定图像存储格式
}
4)线程2进行视频显示
其中的关键是完成图片解压缩,以及颜色转换和像素输出。
jpeg_start_decompress(&cinfo); // 开始解压缩
……
color = RGB888toRGB565(buffer[x * 3], // 颜色转换
buffer[x * 3 + 1],
buffer[x * 3 + 2]);
fb_pixel(fbmem, fb_width, fb_height, x, y, color); // 像素输出
4 结论
在S3C2410硬件平台和嵌入式Linux的嵌入式开发环境下,基于Video4Linux和Framebuffer技术,开发了用于视频采集、压缩、传输、接收和显示的多线程应用软件。软件结构简单、开发难度小,易于移植。系统可靠性、适用性好,前景广阔。
参考文献
[1] 张智超,等. 嵌入式Linux应用开发详解[M].电子工业出版社,2007.
[2] 宋宝华. Linux设备驱动开发详解[M].人民邮电出版社,2008.
[3] 孙琼编.嵌入式Linux应用程序开发详解[M].人民邮电出版社,2006.
[4] 张航,等.基于S3C2410A的嵌入式视频监控系统服务器的设计实现[J].天津农学院学报,2009,16(2).
[5] 孟旭霞,等.嵌入式远程视频监控系统的设计与实现[J].微计算机信息, 2009,25(1-2).
[6] 胡书卫,等.一种基于 Linux的嵌入式视频监控系统实现[J].安防科技,2009,1.
[7] 赵文敏,等.一种嵌入式网络视频监控系统的设计[J].计算机应用与软件,2009,126(8).