 鲜花( 0)  鸡蛋( 0)
|
本文在基于嵌入式Linux系统平台上,采用USB摄像头捕捉视频信号,利用V4L内核应用编程接口函数,实现了视频连续帧图像的采集,并保存成文件的形式利用无线传输方式传输给接收端。这里着重讨论视频采集发送端的实现。6 X' O0 l1 E6 g8 j
1 系统组成
1 q# Z+ N+ S+ g6 } |( D9 v 1.1 统的硬件构成
3 J3 [9 j! \) l. g 本系统包括发送端和接收端2部分,两部分均采用Samsung公司生产的S3C2410处理器做硬件开发平台。S3C2410在片上集成了丰富的组件:分开的16 KB指令Cache和16 KB数据Cache、用于虚拟存储器5 Z; a& ?2 J$ f3 W0 ^5 S7 o
: q9 J3 P% S5 F. B+ f
管理的MMU、支持STN和TFT的LCD控制器、NAND Flash启动装载器、具有片选逻辑和SDRAM控制器的系统管理器、3通道UART、4通道DMA、4通道PWM定时器、I/O口、RTC、8通道10位ADC和触摸屏接口、I2C1 h6 g' h2 K3 U' j8 ]) n/ s
9 O. Y1 @5 {/ z$ k. m总线接口、I2S总线接口、USB主设备、USB从设备、SD卡和MMC卡接口、2通道的SPI以及PLL时钟发生器,还采用了AMBA(advanced micrcocontroller bus architecture)新型总线结构。
& O0 G% P' [8 y6 }, S; z* k+ k 应用S3C2410处理器平台搭建的发送端硬件结构如图:包括S3C2410处理器、RS232接口、JTAG接口、RJ-45接口、SDRMA、Flash、电源、通过USB口连接的视频采集模块和通过USB接口连接的视频发射% W) r7 K) Y" ^* Y
0 b. ]% S+ m, f$ w/ d# @$ V
模块。RS232串口用于人机交互及低速数据的收发,应用电平转换芯片MAX-323进行串口电平和TTL/CMOS电平的转换。JTAG接口用于下载Bootloader。RJ-45接口用于和以太网连接,下载操作系统Linux内7 s! c @7 F: U
! F3 [! z* D7 `2 g4 H
核、根文件系统和应用软件。SDRMA用于系统的数据存储器、Flash用于系统的程序存储器。应用S3C2410处理器平台搭建的接收端硬件电路:与发送终端相比,多了SD卡和LCD显示器。SD卡主要用来存储" {# d3 D' q" u& e7 Y* h
& v5 m3 \' [5 e* U9 y! F
数据,LCD显示器主要用来显示视频图像。2 J4 R6 W, D$ M8 C t8 y. z
1.2 系统软件设计3 }# e; l4 }0 w$ l- z9 `
系统的软件构成分为引导驱动程序、操作系统、文件系统和应用程序4部分。引导驱动程序在系统启动时进行内存重映射,将保存在Flash中的操作系统和应用程序重新映射到SDRAM中。Linux的内核
0 A' H$ R% R. V! k! J+ v4 K2 @( ]
% M- v: w5 C* f6 J: f版本为LinIix2.6。文件系统是Yaffs,它包括模块、配置文件和库等。系统的应用程序建立在嵌入式Linux内核、摄像头驱动和文件系统之上。, {! J' x1 N0 Y9 D' `
2 视频采集的具体实现. s+ L8 \6 O7 S$ x z2 r2 H
USB摄像头连接简单、使用灵活、价格低廉且具有良好的性能,因此,得到了广泛的应用。Linux内核包含了多种USB摄像头驱动,最常用的有基于OV5ll及其兼容芯片。OV511芯片主要包括CAMERA接口3 k2 t7 ]/ N- u# e1 J
% ]" C# y% r; h' F! g. G
、DRMA接口、ISO FIFO接口和OmniCE以及USB控制器等部分。本设计使用的是在低端市场占有率较高的中芯微公司生产的ZC030x系列摄像头芯片。Linux系统中的视频子系统’Vide04linux为视频应用程序0 ` W0 @9 C: B- z4 m# k" C) F
1 q* y( r' s) D, g& }- V提供了一套统一的API,视频应用程序通过调用API即可操作各种不同的视频捕获设备,包括电视卡、视频捕捉卡和USB摄像头等。本设计的具体实现过程如下所述:, b+ q/ W% f6 d' y2 M7 |9 e
2.2 利用Vide041inux实现图像采集
% {6 |$ B) ]$ G 在安装了图像采集设备驱动后,只需要再编写一个对视频采集的应用程序就可以采集视频图像。在Linux系统中,视频文件是设备文件,可以像访问普通文件一样对其进行读写,摄像头文件一般是/* Q$ I, \1 I) W: f$ F3 x
. g, Z. c$ J7 r% V0 e3 N
dev/v4l/video。在进行视频捕捉之前,需要做一些必要的设置工作。这些设置涉及到如下结构:( W0 H6 o2 n, c8 g
V4L下视频采集编程首先要打开视频设备:
7 j5 @* R7 }- S, r8 l Int fd="open"(“/dev/v4l/video”,O_RDONLY);
4 `+ E5 `& y5 H If(fd<O)return-l;+ c/ l, f' ~" z9 O1 k" v
接着对摄像头参数进行设置。一般是先通过I/O控制命令读取设备信息,然后对特定项进行修改,最后通过I/O控制命令保存到内核中。由于篇幅有限源程序不再赘述。
4 ~' o- J( m" N$ }% g 获取基本信息后,可以输出显示,也可以通过ioctl系统调用对这些值进行修改。然后调用函数Char*Carmera_get_image(video_device*vd)获得图像数据指针。此函数比较重要,关系到图像采集的
" T3 F0 a4 H+ h4 p* R3 ]9 G: _
" ^3 z$ h! R8 I1 \* \; ^9 B效率。获取图像数据有2种方法:一是通过映射得到视频驱动的数据缓冲,然后直接对映射后的缓冲进行读操作;二是直接读设备,及调用read函数。下面分别介绍:
4 g" H; K7 r' E$ r5 c3 _* z% B (1)read系统调用方式比较简单,只需将前面得到摄像头参数传入read函数中,得到图像数据指针picture_p后返回即可:read(vd->fd,picture_p,width*hight);其中vd_>fd为设备文件描述符。# R1 K' f; T; U- ?! N- E" Z
(2)利用mmap方式先使用ioctl(fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式,使用& y( H" b* y/ x X8 Q9 T/ H! _" f8 [
8 e# Z5 ?) Q+ K' ^8 @1 ?如下语句:
4 Q* t# p0 j. F grab_buf.height=240;
& X* k5 p+ V M) K, u$ q' Z grab_buf.width=320;
4 Q. P; B5 p1 {; H1 v grab—buf.format=VIDEO_PALETTE_RGB24;5 Z* h1 t' k/ u4 Y
接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*)mmap(O,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_fd,O)操作。这样设备文件的内容就映射
$ C) i( P8 T3 Q3 @$ h0 ?8 {& q$ [$ ? C9 U
到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回图像数据的指针,失败时返回值为-1。
; C/ X! n5 @: N3 i8 V" } 2.1 摄像头驱动的实现4 Z+ U h. c$ s! S- Y
1)配置Vide04linux内核, s6 u$ Z ^4 H) i3 F8 Y$ W
在终端使用make menuconfig命令打开S3C24lOlinux内核编译的main menu窗口,并进入“multimedia device--->”菜单选项,然后将Video for Linux配置为模块,即:
& |6 z* J' ]. j. s9 b) i3 q4 }: Z Device driver--->
1 ~( }) s6 g" L+ P! u Multimedia devices--->
9 d( W/ i+ P& r$ L: b <*>Video for linux
# }( ~, S6 i3 y# d0 \ 2)配置OV511驱动
% L, |. y) v, n. l7 n u, T4 O 返回主菜单,在进入“USB support--->”菜单选项,然后将USB OV5llcamera support设置为模块,即:
1 |; l, M1 u' b7 c SUB suppor---> D R) n0 [8 U+ [8 {1 b1 Z
<*>USB OV5llcamera support(NEW)9 C) A6 ^# k8 m2 \2 [
3)模块安装
* D* b4 \. r) |/ M4 Y2 U$ K 执行以下命令安装视频输入模块:1 {! F1 c& E# i; U
insmod videodev.o
- n& A5 z* w5 B0 ]0 Y( r5 i 执行以下命令安装视频输入设备驱动模块:' Q' d3 j8 b: d A6 _* C
insmod usbcore.o
4 K j* o2 S' S' ~9 R) w* m insmod usb-ohci-s3c2410.ko
: |, H! O. h; z insmod ov511.o
: L2 n. T' z( E# c: s6 W# F- N/ J 由于使用的设备是USB接口的摄像头,所以在加载ov511.o模块前,需要加载USB内核驱动和主机控制器驱动。 Z6 H8 q7 Z6 n. J8 U- X, i+ M
3 无线传输模块6 b& B+ S, g* V5 `* |0 G* |
本系统选用西门子的MC235作为GPRS通信模块,来实现图像的无线传输。该模块结合语音、数据传输、短信服务等功能,最大传输速率可以达到85.6 Kbps,具有丰富的AT指令使模块与微处理器通信,功能强大,操作灵活方便,特别适用于数据的监测和传输。在进行GPRS传输操作之前需对模块进行设置,主要有:(1)设置通信波特率;(2)设置接入网关;(3)设置移动终端类别;(4)测试GPRS服务是否开通,激活GPRS功能。这些设置都在主程序的初始化代码段完成。通过测试,GPRS驱动正常工作,能很好地支持数据/命令复合协议传输,其协议的丢包率、吞吐量等性能指标与无线模块的指标无实质性差别,整个系统工作正常,基本达到设计要求。
& w! C2 \8 T: @: ^( r转自:http://www.3gtarena.com/ |
|