 鲜花( 0)  鸡蛋( 0)
|
本文在基于嵌入式Linux系统平台上,采用USB摄像头捕捉视频信号,利用V4L内核应用编程接口函数,实现了视频连续帧图像的采集,并保存成文件的形式利用无线传输方式传输给接收端。这里着重讨论视频采集发送端的实现。; ^6 w2 W; J9 }+ b" s
1 系统组成+ Y. R8 M v9 u
1.1 统的硬件构成& Y, d$ ~( V3 r5 A. m
本系统包括发送端和接收端2部分,两部分均采用Samsung公司生产的S3C2410处理器做硬件开发平台。S3C2410在片上集成了丰富的组件:分开的16 KB指令Cache和16 KB数据Cache、用于虚拟存储器
& f& Y# b2 z* ^+ g) N( q9 q8 r4 \. A; L' f' z2 o- q# b
管理的MMU、支持STN和TFT的LCD控制器、NAND Flash启动装载器、具有片选逻辑和SDRAM控制器的系统管理器、3通道UART、4通道DMA、4通道PWM定时器、I/O口、RTC、8通道10位ADC和触摸屏接口、I2C
* J) ^5 k9 R7 x
+ O% a0 ~; C A总线接口、I2S总线接口、USB主设备、USB从设备、SD卡和MMC卡接口、2通道的SPI以及PLL时钟发生器,还采用了AMBA(advanced micrcocontroller bus architecture)新型总线结构。
2 Z+ V5 s* v9 H8 ]4 X5 K) ~& W 应用S3C2410处理器平台搭建的发送端硬件结构如图:包括S3C2410处理器、RS232接口、JTAG接口、RJ-45接口、SDRMA、Flash、电源、通过USB口连接的视频采集模块和通过USB接口连接的视频发射 H+ E4 F- o" a+ E. r6 ]
5 g5 G, k A+ M1 ~
模块。RS232串口用于人机交互及低速数据的收发,应用电平转换芯片MAX-323进行串口电平和TTL/CMOS电平的转换。JTAG接口用于下载Bootloader。RJ-45接口用于和以太网连接,下载操作系统Linux内# s0 L# z1 |& k& R6 h
o; z- Z4 [; A% ^: ^4 w q
核、根文件系统和应用软件。SDRMA用于系统的数据存储器、Flash用于系统的程序存储器。应用S3C2410处理器平台搭建的接收端硬件电路:与发送终端相比,多了SD卡和LCD显示器。SD卡主要用来存储
" a) _; Z- L5 ^* P5 ^/ y3 b! W; m: Q u5 t/ i
数据,LCD显示器主要用来显示视频图像。
1 D0 G' T' X9 `" w7 k 1.2 系统软件设计0 K# X, d7 Z& E" }# U- T6 {
系统的软件构成分为引导驱动程序、操作系统、文件系统和应用程序4部分。引导驱动程序在系统启动时进行内存重映射,将保存在Flash中的操作系统和应用程序重新映射到SDRAM中。Linux的内核0 a5 }. B6 W. W% }8 A& I9 {* m
. |$ z, a5 t9 M q5 O版本为LinIix2.6。文件系统是Yaffs,它包括模块、配置文件和库等。系统的应用程序建立在嵌入式Linux内核、摄像头驱动和文件系统之上。2 E4 i( Z3 }9 C& Y
2 视频采集的具体实现! C- x V4 w3 w
USB摄像头连接简单、使用灵活、价格低廉且具有良好的性能,因此,得到了广泛的应用。Linux内核包含了多种USB摄像头驱动,最常用的有基于OV5ll及其兼容芯片。OV511芯片主要包括CAMERA接口
6 [, w5 A% n/ S! n
! b9 h0 d& v. J( ]4 r# M5 D- ~; l8 i* }、DRMA接口、ISO FIFO接口和OmniCE以及USB控制器等部分。本设计使用的是在低端市场占有率较高的中芯微公司生产的ZC030x系列摄像头芯片。Linux系统中的视频子系统’Vide04linux为视频应用程序) K: A( z' P7 J* ]9 i6 `
0 _, `' T& P% Y
提供了一套统一的API,视频应用程序通过调用API即可操作各种不同的视频捕获设备,包括电视卡、视频捕捉卡和USB摄像头等。本设计的具体实现过程如下所述:% `! {0 j& a, |' j& @3 k! P
2.2 利用Vide041inux实现图像采集- y; @7 D) J+ g/ o9 U
在安装了图像采集设备驱动后,只需要再编写一个对视频采集的应用程序就可以采集视频图像。在Linux系统中,视频文件是设备文件,可以像访问普通文件一样对其进行读写,摄像头文件一般是/% j, F3 j5 r" U! a- u# b: B2 _' s. p
7 A: g$ n$ n! A4 adev/v4l/video。在进行视频捕捉之前,需要做一些必要的设置工作。这些设置涉及到如下结构:
5 `$ ^3 v1 U" q" G8 a V4L下视频采集编程首先要打开视频设备:
$ ~6 K9 F; ?4 R1 n {9 _5 Y1 y Int fd="open"(“/dev/v4l/video”,O_RDONLY);# _0 {/ K# l; g# L3 \0 v2 H
If(fd<O)return-l;
' N, x$ ]- f4 x# n+ H 接着对摄像头参数进行设置。一般是先通过I/O控制命令读取设备信息,然后对特定项进行修改,最后通过I/O控制命令保存到内核中。由于篇幅有限源程序不再赘述。- v) _" F. T- [" P
获取基本信息后,可以输出显示,也可以通过ioctl系统调用对这些值进行修改。然后调用函数Char*Carmera_get_image(video_device*vd)获得图像数据指针。此函数比较重要,关系到图像采集的
6 f: K: L/ Q, j( P5 I
+ _' p) l8 O9 V& E1 ?7 J5 q% n效率。获取图像数据有2种方法:一是通过映射得到视频驱动的数据缓冲,然后直接对映射后的缓冲进行读操作;二是直接读设备,及调用read函数。下面分别介绍:. c K, Q- X4 U+ o+ t8 y
(1)read系统调用方式比较简单,只需将前面得到摄像头参数传入read函数中,得到图像数据指针picture_p后返回即可:read(vd->fd,picture_p,width*hight);其中vd_>fd为设备文件描述符。
4 r3 l' G; t" x (2)利用mmap方式先使用ioctl(fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式,使用
3 L5 W m( M" y
$ Z8 i0 k1 X' Q如下语句:
$ Q! P! g* A! t$ Y$ V grab_buf.height=240;
% H0 R; B* d* f. m& ?* \( _ grab_buf.width=320;- U; ~9 p8 w6 s) P2 @6 F# v
grab—buf.format=VIDEO_PALETTE_RGB24;
% M. `+ F, c1 e 接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*)mmap(O,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grab_fd,O)操作。这样设备文件的内容就映射
( L5 Q; }7 x+ K( e( B
# Y5 L! T* j. g- B) |到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回图像数据的指针,失败时返回值为-1。
5 v; _; m4 C* k- K/ l0 A 2.1 摄像头驱动的实现9 [/ z" l3 H U6 M
1)配置Vide04linux内核
- f& V; F% X' z$ }2 D$ l7 P 在终端使用make menuconfig命令打开S3C24lOlinux内核编译的main menu窗口,并进入“multimedia device--->”菜单选项,然后将Video for Linux配置为模块,即:9 z* U# i+ K- [) u% d/ z" [% {
Device driver--->5 i0 E0 d' s- V6 P, |
Multimedia devices--->
: X5 R6 T: M, }9 q! O- Z2 P <*>Video for linux" v5 H. |) I: E# m3 S
2)配置OV511驱动
! ~& C/ p$ q# G- u5 p 返回主菜单,在进入“USB support--->”菜单选项,然后将USB OV5llcamera support设置为模块,即:: y, h0 Z8 O+ D
SUB suppor--->
: W) c! z/ `" l4 ~7 V6 N6 l <*>USB OV5llcamera support(NEW). Y* I; t8 B( o% t5 z; }
3)模块安装
6 M) _& {9 A( ?: d8 b; m 执行以下命令安装视频输入模块:' D6 m* ?( S% e$ ]
insmod videodev.o
5 b/ { U. o5 L$ y+ e: c 执行以下命令安装视频输入设备驱动模块:0 X. `' a& s& T& v( Q; x) {
insmod usbcore.o
8 N7 ^1 G2 e# f, L# Q" U* | S insmod usb-ohci-s3c2410.ko
, Z' G# |% N$ G- j# `3 P: H6 o insmod ov511.o
3 w: {. b! j4 ?2 d) c 由于使用的设备是USB接口的摄像头,所以在加载ov511.o模块前,需要加载USB内核驱动和主机控制器驱动。
6 \' d8 q9 q* B' B D 3 无线传输模块
/ H$ S5 R2 E3 D6 M) {- l 本系统选用西门子的MC235作为GPRS通信模块,来实现图像的无线传输。该模块结合语音、数据传输、短信服务等功能,最大传输速率可以达到85.6 Kbps,具有丰富的AT指令使模块与微处理器通信,功能强大,操作灵活方便,特别适用于数据的监测和传输。在进行GPRS传输操作之前需对模块进行设置,主要有:(1)设置通信波特率;(2)设置接入网关;(3)设置移动终端类别;(4)测试GPRS服务是否开通,激活GPRS功能。这些设置都在主程序的初始化代码段完成。通过测试,GPRS驱动正常工作,能很好地支持数据/命令复合协议传输,其协议的丢包率、吞吐量等性能指标与无线模块的指标无实质性差别,整个系统工作正常,基本达到设计要求。/ }2 x& _4 D2 r- C1 ?
转自:http://www.3gtarena.com/ |
|