 鲜花( 0)  鸡蛋( 0)
|
本文在基于嵌入式Linux系统平台上,采用USB摄像头捕捉视频信号,利用V4L内核应用编程接口函数,实现了视频连续帧图像的采集,并保存成文件的形式利用无线传输方式传输给接收端。这里着重讨论视频采集发送端的实现。: V8 O1 _9 C% m) }$ `' \5 N _7 m" i
1 系统组成
6 S* J! G0 V9 ?3 C, J I6 n 1.1 统的硬件构成
) x! [" X. `( F. c. ?" n 本系统包括发送端和接收端2部分,两部分均采用Samsung公司生产的S3C2410处理器做硬件开发平台。S3C2410在片上集成了丰富的组件:分开的16 KB指令Cache和16 KB数据Cache、用于虚拟存储器. V. R) Z& y2 P2 \! C
7 L9 ~8 u$ s* \管理的MMU、支持STN和TFT的LCD控制器、NAND Flash启动装载器、具有片选逻辑和SDRAM控制器的系统管理器、3通道UART、4通道DMA、4通道PWM定时器、I/O口、RTC、8通道10位ADC和触摸屏接口、I2C
3 C+ o, C0 i( z: l; k5 ^- ?, k5 z! _: T7 X. a
总线接口、I2S总线接口、USB主设备、USB从设备、SD卡和MMC卡接口、2通道的SPI以及PLL时钟发生器,还采用了AMBA(advanced micrcocontroller bus architecture)新型总线结构。5 h+ X! T2 v$ G# L
应用S3C2410处理器平台搭建的发送端硬件结构如图:包括S3C2410处理器、RS232接口、JTAG接口、RJ-45接口、SDRMA、Flash、电源、通过USB口连接的视频采集模块和通过USB接口连接的视频发射
. p2 Z [( D' h) }5 i
4 m3 G% k$ t6 ^) [3 d' Q模块。RS232串口用于人机交互及低速数据的收发,应用电平转换芯片MAX-323进行串口电平和TTL/CMOS电平的转换。JTAG接口用于下载Bootloader。RJ-45接口用于和以太网连接,下载操作系统Linux内$ m$ h2 b8 h3 Z. @' H
- {$ z$ v" N9 {! E, E核、根文件系统和应用软件。SDRMA用于系统的数据存储器、Flash用于系统的程序存储器。应用S3C2410处理器平台搭建的接收端硬件电路:与发送终端相比,多了SD卡和LCD显示器。SD卡主要用来存储
" _+ E8 h0 J) K( d, Y& b. N7 h; p4 s
数据,LCD显示器主要用来显示视频图像。
1 S* W) x" c9 j 1.2 系统软件设计
* o0 R1 w# X2 B: p 系统的软件构成分为引导驱动程序、操作系统、文件系统和应用程序4部分。引导驱动程序在系统启动时进行内存重映射,将保存在Flash中的操作系统和应用程序重新映射到SDRAM中。Linux的内核
" Z* s3 ?. Q V
1 f/ U2 s: E! K5 B# v版本为LinIix2.6。文件系统是Yaffs,它包括模块、配置文件和库等。系统的应用程序建立在嵌入式Linux内核、摄像头驱动和文件系统之上。6 v" \9 k- d+ k% Y+ u5 `
2 视频采集的具体实现
# D8 I5 \' x" C" y! e: z% }3 f* \ USB摄像头连接简单、使用灵活、价格低廉且具有良好的性能,因此,得到了广泛的应用。Linux内核包含了多种USB摄像头驱动,最常用的有基于OV5ll及其兼容芯片。OV511芯片主要包括CAMERA接口
- S# z4 B) U, j2 ]& N0 [
9 H* B: ]% c! S3 J7 `2 w、DRMA接口、ISO FIFO接口和OmniCE以及USB控制器等部分。本设计使用的是在低端市场占有率较高的中芯微公司生产的ZC030x系列摄像头芯片。Linux系统中的视频子系统’Vide04linux为视频应用程序
; ^5 g$ q8 H. }" e( O. _. e5 I1 i, m
( N/ y: x1 P; H T/ ?* `( ~: Z! h提供了一套统一的API,视频应用程序通过调用API即可操作各种不同的视频捕获设备,包括电视卡、视频捕捉卡和USB摄像头等。本设计的具体实现过程如下所述:6 |6 P4 ?, W% s
2.2 利用Vide041inux实现图像采集
! n* _0 L! E V 在安装了图像采集设备驱动后,只需要再编写一个对视频采集的应用程序就可以采集视频图像。在Linux系统中,视频文件是设备文件,可以像访问普通文件一样对其进行读写,摄像头文件一般是/
7 z% z2 l- [3 r. i4 o9 U3 r0 f, P' O5 m+ w; y: R0 u
dev/v4l/video。在进行视频捕捉之前,需要做一些必要的设置工作。这些设置涉及到如下结构:
+ M% d% Q9 y B+ b; \# W* m4 [ V4L下视频采集编程首先要打开视频设备:
/ L# z" r9 }, j2 X Int fd="open"(“/dev/v4l/video”,O_RDONLY);& x/ @2 M! V1 M# t1 [0 j; Q1 n
If(fd<O)return-l; `. `: ^1 Z9 E) T0 w5 S2 u, K
接着对摄像头参数进行设置。一般是先通过I/O控制命令读取设备信息,然后对特定项进行修改,最后通过I/O控制命令保存到内核中。由于篇幅有限源程序不再赘述。, s6 m( L( l9 I8 x! R$ a. O
获取基本信息后,可以输出显示,也可以通过ioctl系统调用对这些值进行修改。然后调用函数Char*Carmera_get_image(video_device*vd)获得图像数据指针。此函数比较重要,关系到图像采集的: ^' D/ U- D0 N- }9 w" X5 r \: z
9 e7 ]- N4 J# C' g
效率。获取图像数据有2种方法:一是通过映射得到视频驱动的数据缓冲,然后直接对映射后的缓冲进行读操作;二是直接读设备,及调用read函数。下面分别介绍:8 M; C S% I5 e+ L
(1)read系统调用方式比较简单,只需将前面得到摄像头参数传入read函数中,得到图像数据指针picture_p后返回即可:read(vd->fd,picture_p,width*hight);其中vd_>fd为设备文件描述符。
: f- u6 n' Z+ h (2)利用mmap方式先使用ioctl(fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式,使用
/ o5 Z( q7 H* d! W! A- O+ Z7 H' T2 W9 n
如下语句:
$ m# `- e0 H) W+ W# E6 G grab_buf.height=240;
4 Z8 R# W; d9 R5 z grab_buf.width=320;( q0 L6 _2 d" f& d# p8 N8 \
grab—buf.format=VIDEO_PALETTE_RGB24;
) O$ d8 Y1 A6 P( @* ] 接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*)mmap(O,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_fd,O)操作。这样设备文件的内容就映射6 P# J) i) l3 P) e# k M
: s5 e( U* p5 n
到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回图像数据的指针,失败时返回值为-1。: V3 J4 S# V6 ?- g/ b% k* I
2.1 摄像头驱动的实现
. o( i* I% D7 V" u% G 1)配置Vide04linux内核- [) o* ]$ e$ d% I' x
在终端使用make menuconfig命令打开S3C24lOlinux内核编译的main menu窗口,并进入“multimedia device--->”菜单选项,然后将Video for Linux配置为模块,即:
" [ D; r/ {. H* K Device driver--->- N- P0 g1 L0 V! q! E$ U
Multimedia devices--->8 V9 R/ a4 e) f- I
<*>Video for linux
: \5 `0 G( ~' C- `# ] 2)配置OV511驱动
" p% Q4 w: O) h9 a5 g5 K 返回主菜单,在进入“USB support--->”菜单选项,然后将USB OV5llcamera support设置为模块,即:- Y: ]0 W9 ?7 L; W% s+ o! h8 I2 l
SUB suppor--->
8 L6 d7 C# K' B4 D9 J- `- N! o+ q <*>USB OV5llcamera support(NEW)
+ ]/ Q- [! ?( [( a& i 3)模块安装
5 G$ G1 Q) S- c+ \ 执行以下命令安装视频输入模块:
5 f; N, Z- }6 A0 B$ ?9 P# ] insmod videodev.o
- W4 k* o9 @$ V% X9 R4 |1 i 执行以下命令安装视频输入设备驱动模块:0 m& \& r O4 W% @7 }
insmod usbcore.o
3 W+ I3 x( V4 c$ @5 [# ] insmod usb-ohci-s3c2410.ko
# s# x' n" p1 M' T) A insmod ov511.o
3 q" Z5 g2 }" F" j 由于使用的设备是USB接口的摄像头,所以在加载ov511.o模块前,需要加载USB内核驱动和主机控制器驱动。
0 P- F1 I4 f3 b 3 无线传输模块4 i4 |" b. _' H- _% z- P
本系统选用西门子的MC235作为GPRS通信模块,来实现图像的无线传输。该模块结合语音、数据传输、短信服务等功能,最大传输速率可以达到85.6 Kbps,具有丰富的AT指令使模块与微处理器通信,功能强大,操作灵活方便,特别适用于数据的监测和传输。在进行GPRS传输操作之前需对模块进行设置,主要有:(1)设置通信波特率;(2)设置接入网关;(3)设置移动终端类别;(4)测试GPRS服务是否开通,激活GPRS功能。这些设置都在主程序的初始化代码段完成。通过测试,GPRS驱动正常工作,能很好地支持数据/命令复合协议传输,其协议的丢包率、吞吐量等性能指标与无线模块的指标无实质性差别,整个系统工作正常,基本达到设计要求。
! I2 j9 m7 V( o) `/ t: ]* D转自:http://www.3gtarena.com/ |
|