还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
嵌入式课程设计报告
一、课程设计目的掌握开发环境的搭建;
1.1linux巩固嵌入式交叉编译的开发思想;
1.2掌握嵌入式软件设计技,.
1.3GUI
二、课程设计规定
三、输入信号…视频信号,规定系统能..路输入信号进行实时采集,数字.解决,A.压缩,存储,要保证一定的录像质量.根据设计题目的规定,选择拟.芯片型号,.AR视频采集芯片型号,完毕系统硬件.计和程序设计.课程设计内容
四、设计原理系列微解决器为低功耗的位解决器,最适合用ARM1032RISC于对价位和功耗要求较高的消费类应用..系列微解决器的重要应用领域为:工业控制.设备,调制.调器ARM1,Interne设备,移动电话等多种多媒体和嵌入式应用.视频监控系统总体设计一方面需要对系统进行总体规划川等系统划提成几个功能模块,拟定各个模块的实现方法.整个视频监控系统采用结构,从主体C/S上分为两部分:服务器端和客户端.服务器端重要涉及平台上运营的采集,S3C4510压缩,传输程序,客户端是机上运营的接受,解压,回放程序.视频监控终端PC从摄像头捕获实时的视频信息,压缩之后通过以太网传输到视频监控服务解决库等,解决了多个问题,在解决问题的过程中,我们对嵌入式的开发过程多了一些细节的结识,为以后的连续学习巩固了基础
十三、在设计过程中,我们分工合作,一起进步,不只从理论上对嵌入式有了更深的结识,同时从实践中验证了学习的理论知识,对嵌入式有了更深一步的结识
十四、源程序清单#include stdio.h#include stdlib.h#include sys/types.h#include sys/stat.h#include fcntl.h#include sys/ioctl.h#include sys/mman.h#include errno.h#include linux/videodev.h#include jpeglib.h#include unistd.h#include math.h#include errno.h#include string.h#include signal.h#include pthread.h#include sys/time.h#include sys/mman.h#include getopt.h#define WIDTH640#define HEIGHT480#define DEFAULT_DEVICE7dev/v41/videolnint write_jpegchar*filename,unsigned char*buf,int quality,int width,int height,int gray{structjpeg_compress_struct cinfo;struct jpeg_error_mgr jerr;FILE*fp;int i;unsigned char*line;int linelength;if NULL==fp=fopenfilename,,w,fprintfstderr,ngrab:cant open%s:%s\nH,filename,strerrorerrno;return-1;}cinfo.err=jpeg_std_errorjerr;jpeg_create_compresscinfo;jpeg_stdio_destcinfo,fp;cinfo.image_width=width;cinfo.image_height=height;cinfo.input_components=gray1:3;cinfo.in_color_space=grayJCS_GRAYSCALE:JCS_RGB;jpeg_set_defaultscinfo;jpeg_set_qualitycinfo,quality,TRUE;jpeg_start_compresscinfo,TRUE;line_length=graywidth:width*3;for i=0,line=buf;iheight;i++,line+=line_lengthjpeg_write_scanlinescinfo,line,1;jpeg_finish_compresscinfo;jpeg_destroy_compresscinfo;fclosefp;〃〃〃〃〃〃/〃〃〃〃//〃〃〃〃〃/〃/〃〃〃〃〃〃/〃〃〃〃〃〃〃〃〃/char fnl
[30]=,7var/www/pic
001.jpg1;char fn2
[30]=n/var/www/pic
002.jpgH;if NULL==fp=fopenfnl,V{fclosefp;removefnl;}renamefn2,fnl;〃/〃〃〃/〃〃〃〃〃〃/〃〃〃〃〃〃〃〃〃/〃〃〃/〃〃〃〃〃/〃/〃〃〃return0;//这个函数很通用,它的作用是把buf中的数据压缩成jpeg格式struct_v41_structint fd;〃保存打开视频文献的设备描述符struct video_capability capability;struct video_picture picture;struct video_mmap mmap;struct video_mbuf mbuf;unsigned char*map;//用于指向图像数据的指针int frame_current;int frame_using[VIDEO_MAX_FRAME];//这两个变量用于双缓冲};typedef struct_v41_struct v41_device;extern int v41_openchar*,v41_device*;extern int v41_closev41_device*;extern int v41_get_capabilityv41_device*;extern int v41_get_picturev41_device*;extern int v41_get_mbufv41_device*;extern int v41_set_picturev41_device*,int,int,int,int,int;extern int v41_grab_picturev41_device*,unsigned int;extern int v41_mmap_initv41_device*;extern int v41_grab_initv41_device*,int,int,int;extern int v41_grab_framev41_device*,int;extern int v41_grab__syncv41_device*;intv41_openchar*dev,v41_device*vddev=DEFAULT_DEVICE;ifvd-fd=opendev,O_RDWR0{perror*,v41_openn;return-1;}ifv41_get_capabilityvdreturn-1;ifv41_get_picturevdretum-1;//这两个函数就是即将要完毕的获取设备信息的函数return0;intv41_get_capabilityv41_device*vdif ioctlvd-fd,VIDIOCGCAP,vd-capability0{perrorn v41_get_capabi1ity:n;return-1;return0;intv41_get_picturev41_device*vdif ioctlvd-fd,VIDIOCGPICT,vd-picture0{perrornv41_get_picture:;return-1;return0;intv41_get_mbufv41_device*vd{if ioctlvd-fd,VIDIOCGMBUF,vd-mbuf0{perrorHv41_get_mbuf:;return-1;return0;intv41_set_picturev41_device*vd,int br,int hue,int col,int contentwhite/*ifbr*/vd-picture.brightness=25000;/*ifhue*/vd-picture.hue=25000;/*ifcol*/vd-picture.colour=65535;/*ifcont*/vd-picture.contrast=30000;/*ifwhite*/vd-picture.whiteness=25000;ifioctlvd-fd,VIDIOCSPICT,vd-picture0{perrorn v41_set_picture:H;return-1;}return0;intv41_grab_picturev41_device*vd,unsigned intsizeifreadvd-fd,vd-map,size=Oretum-1;return0;intv41_mmap_initv41_device*vd{if v41_get_mbufvd0return-1;if vdmap=mm叩0,vd-mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd-fd,00{perrorHv41_mmap_init:mmapn;return-1;return0;intv41_grab_initv41_device*vd,int width,int height,int palvd-mmap.width=width;vd-mmap.height=height;pal=vd-picture.palette;vd-mmap.format=pal;vd-frame_current=0;vd-frame_using[O]=FALSE;vd-frame_using
[1]=FALSE;return v41_grab_framevd,0;〃真正获得图像的函数extern intv41_grab_framev41_device*,int;intv41_grab_framev41_device*vd,int frameifvd-frame_using[frame]{fprintfstderr,nv4l_grab_frame:frame%d isalready used.n,frame;return-1;vd-mmap.frame=frame;if ioctlvd-fd,VIDIOCMCAPTURE,vd-mmap0{perrorn v41_grab_framen;return-1;vd-frame_using[frame]=TRUE;vd-frame current=frame;return0;//在截取图像后还要进行同步操作,就是调用extern intv4I_grab_syncv41_device*;该函数如下intv41_grab_syncv41_device*vd ifioctlvd-fd,VIDIOCSYNC,vd-frame_current0{perrorn v41_grab_sy ncn;vd-frame_using[vd-frame_current]=FALSE;return0;intv41_closev41_device*vd closevd-fd;return0;〃该函数返回0说明你想要获取的图像帧已经获取完毕〃图像的位置,存在vd.map+vd.mbuf.offsets[vd.frame_current]处其中vd.frame_current=O,为〃第一帧的位置,vd.frame_current=l,为第二帧的位置void bufBRExchangeunsigned char*buf,int bufLengthint i=0;printfnECHG SUC\nn;//bufLength-=2;unsigned chartemp;fori=15;i921615;i+=3temp=buf[i];buf[i]=buf[i+2];buf[i+2]=temp;int main{v41_device vd;unsigned char*buf;//unsigned charnbuf
[1843216];v41_openDEFAULT_DEVICE,vd;v41_mmap_initvd;v41_grab_initvd,640,480,0;v41_grab_syncvd;//此时就已经获得了一帧的图像,存在vd.map中//buf=unsigned char*vd.map+vd.mbuf.offsets[vd.frame_current];whileTRUEbuf=vd.map+vd.mbuf.offsets[vd.frame_current];printfn%d\nn,vd.mbuf.size;bufBRExchangebuf,vd.mbuf.size;//unsigned charechg;vd.frame_current A=1;v41_grab_framevd,vd.frame_current;v41_grab_syncvd;printfnFRAME1OK!\nH;if-l==write Jpeg*7var/www/pic
002.jpgn,buf,30,640,480,0printfnwrite_jpeg error\nn;exitl;printfnFRAME2OK!\nn;〃图像解决函数vd.map+vd.mbuf.offsets|vd.frame_current];〃循环采集〃其中vd.map+vd.mbuf.offsets[vd.frame_current]就是图像所在位置v41_closevd;器上.视频图像采集和打包发送在服务器端完毕,图像的接.解包和回放将在客户端完毕.采集图.数据压.打包发.接受系统的硬件设计系统采用模块化设计方案,重要涉及以下几个模块:主控制器模块,储存电路模块,外围接口电路模块,电源和复位电路,主控器模块S3C4510主控器模块是整个系统的核心,采用的解决器公司的S3C4510B.Samsung是基于以太网应用系统的高性价比位微控制器,内含一个S3C4510B16/32RISC由公司设计的位解决器核,为低功耗,ARM16/32ARM7TDMI RISCARM7TDMI高性能的核,系统存储电路模块16/32主控器还需一些外围存储单元中包.Nan.Flash,.SDRAM.Nan.Flas..Liu.Bootloader,系统内核,文献系统,应用程序以及环境变量和系统配置文献等;读写速度快,.DRA.系统运营时把它作为内存单元使用.外围电路模块外围电路重要是以下几个电路,复位电路图,电源电路图以及电路,JTAG
三、课程设计设备及工具硬件UP-NETARM2410-S嵌入式实验仪、PC机、ov511摄像头;软件PC机操作系统REDHAT LINUX
9.
0、MINICOM、AMR-LINUX开发环境
四、设计方案本次课程设计采用arm10开发平台该平台采用Samsung公司的解决器S3c2410该解决器内部集成了ARM公司ARM920T解决器核的32位微控制器,资源丰富,带独立的16KB的指令Cache和16KB数据Cache LCD控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA.4路带PWM的Timer,并行I/O口、8路10位ADC.Touch Screen接口、12c接口、12s接口、2个USB接口控制器、2路SPI,主频最高可达203MHz在解决器丰富资源的基础上,还进行了相关的配置和扩展,平台配置了16MB16位的Flash和64MB32位的SDRAM通过以太网控制器芯片DM9000Eo扩展了一个网口,此外引出了一个HOST USB接口通过在USB接口上外接一个带USB口的摄像头,将采集到的视频图像数据放入输入缓冲区中然后,对缓冲区中的视频数据进行压缩成帧,并把每一帧图片在网页中显示出来,每秒钟刷新两次,得到一个动态的视频界面,然后通过局域网访问该主机的网页,得到网络视频信息本次课程设计重要是完毕得到视频图片及网页刷新的过程本次设计规定在局域网环境中进行
五、开发环境配置摄像头驱动加载
5.1在Linux下,设备驱动程序可以当作Linux内核与外部设备之间的接口设备驱动程序向应用程序屏蔽了硬件实现了的细节,使得应用程序可以像操作普通文献同样来操作外部设备,可以使用和操作文献中相同的、标准的系统调用接口函数来完毕对硬件设备的打开、关闭、读写和I/O控制操作,而驱动程序的重要任务也就是要实现这些系统调用函数本系统平台使用的嵌入式arm-Linux系统在内核重要功能上与Linux操作系统没本质区别Video4Linux简V4L是Linux中关于视频设备的内核驱动,它为针对视频设备的应用程序编程提供一系列接口函数,这些视频设备涉及现今市场上流行的TV卡、视频捕获卡和USB摄像头等ov511的驱动,
2.4的内核中就有,所以我们只需重新编译内核,将下边的选项都选上,然后重新烧写内核就可以了也就是直接静态加载1在arm linux的kernel目录下make menuconfigo2一方面*选择Multimedia device->下的Video forlinux加载ovideo41inux模块,为视频采集设备提供编程接口;3然后在usb support-〉目录下*选择support forusb和usb cameraov511supporto这使得在内核中加入了对采用0V511接口芯片的USB数字摄像头的驱动支持4保存配置退出5make dep;make zlmage就生成了带有ov511驱动的内核接下来就通过Uboot将内核烧到flash里去这时你将摄像头插上,系统就会提醒发现摄像头PV511+,这说明驱动正常-,驱动加载就成功了安装库
5.2jpeg在土也址.uu net/graphics/jpeg/jpegsrc.v6b.tar.gz中下载jpeg库・的压缩包#tar-zxvf jpegsrc.v6b.tar.gz//角星压库文献#cd jpeg-6b#./configure--prefix=/usr/local/jpeg6--enable-shared//生成MAKEFILE文献#make〃编译安装文献ftmkdir/usr/local/jpeg6ftmkdir/usr/local/jpeg6/includettmkdir/usr/local/jpegftmkdir/usr/local/jpeg/libftmkdir/usr/local/jpeg/binftmkdir/usr/local/jpeg/manftmkdir/usr/local/jpeg/man/man1〃建立生成安装文献的目录ftmake install-lib/生成安装文献#make install〃开始安装文献
六、设计过程硬件设计
6.1系统的主体设计思想是将视频前端和嵌入式Web服务器整合在一起,摄像头通过USB接口和嵌入式系统板的USB HOST相连,摄像头采集来的视频信号通过压缩后,通过内部总线传送到内置的Web服务器,客户端采用浏览器/服务器结构(即B/S结构),可以通过IE浏览器访问视频Web服务器,以便查看所监控的视频画面,并且,用户还可以控制平台对镜头的动作或对系统进行配置控制网络视频采集系统是由视频监控终端和视频监控中心组成,终端使用嵌入式系统加上USB摄像头,在Linux操作系统上运营USB摄像头的驱动和相应的视频采集解决传输程序,得到视频监控画面,并画面通过网络传输,监控中心运营监控软件端,通过Internet浏览器来浏览终端送来的监控画面,其硬件连接图如下所示:ov511摄像头ARM2410网络视频采集硬件连接图从图中可以看出,PC机部分可以直接采用IE浏览器,不需要在PC机上运营其他的软件,重要设计工作是开发板端的设计视频监控终端重要有两个部分组成,硬件部分涉及摄像头和开发平台的选择;软件部分涉及系统级软件(Boot Loader,嵌入式操作系统,USB驱动程序)与用户级软件(应用程序)软件设计
6.2Video41inux为应用程序提供了一系列的接口函数,通过这些函数,可以执行打开、读写、关闭等基本操作设备驱动提供了read、write、open、close等函数的具体实现,在内核这些函数都可以调用视频采集流程图如下所示打开设备并初始化采集视频数图像处理据是否结景采集Y关闭视频设备结视频采集流程图
(1)运用V4L编写的视频采集程序重要代码如下,下列代码包含采集编码程序一些关键函数
(2)程序中定义的数据结构struct_v41_struct{int fd;//保存打开视频文献的设备描述符struct video_capability capability;struct video_picture picture;struct videommap mmap;unsigned char*map;//用于指向图像数据的指针struct videombuf mbuf;int frame_current;int frame_using[VIDEO_MAX_FRAME];//这两个变量用于双缓冲};typedef struct_v41_struct v41_device;这些数据结构都是由Video4Linux支持的,它们的用途如下*video_capability包含摄像头的基本信息,例如设备名称、支持的最大最小分辨率、信号源信息等;*voide_picture包含设备采集图像的各种属性,如brightness(亮度)、hue(色调)、contrast(对比度)、whiteness(色度)、color(深度)等;*video_mmap用于内存映射;*voido_mbuf运用mmap进行映射的帧信息,事实上是输入到摄像头存储器缓冲中的帧信息,涉及size(帧的大小)、frames(最多支持的帧数)、offsets(每帧相对基址的偏移)程序中用到的重要系统调用函数有open(〃/dev/voideoO”,int flags)close(fd)mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset)munmap(void*start,size_tlength)^0ioctl(int fd,intcmd,,•,)o前面提到Linux系统中把设备当作设备文献,在用户空间可以通过标准的I/O系统调用函数操作设备文献,从而达成与设备通信交互的目的当然,在设备驱动中要提供对这些函数的相应支持这里说明一下ioctl(int fd,int cmd,…)函数,它在用户程序中用来控制I/O通道,其中,fd代表设备文献描述符,cmd代表用户程序对设备的控制命令,省略号一般是一个表达类型长度的参数,也可没有
(2)采集程序实现过程一方面打开视频设备,摄像头在系统中相应的设备文献为/dev/videoO,采用系统调用函数grab_fd=open(/dev/videoO,O_RDWR),grab_fd是设备打开后返回的文献描述符打开错误返回-1,以后的系统调用函数就可使用它来对设备文献进行操作了接着,运用ioctl grab_fd,VIDIOCGCAP,grab_cap函数读取struct video_capability中有关摄像头的信息该函数成功返回后,这些信息从内核空间拷贝到用户程序空间grab_cap各成员分量中,使用printf函数就可得到各成员分量信息,例如printf maxheight=%d”,grab fd.maxheight获得最大垂直分辨率的大小不规则用ioctl grab_fd,VIDIOCGPICT,grab_pic函数读取摄像头缓冲中voideo_picture信息在用户空间程序中可以改变这些信息,具体方法为先给分量赋新值,再调用VIDIOCSPICT ioctl函数,例如grab_fd.depth=3;ifioctlgrab_fd,VIDIOCSPICT,grab_pic0{perror,,VIDIOCSPICT,/;return-1;};完毕以上初始化设备工作后,就可以对视频图像截取了,有两种方法一种是read直接读取;此外一种mmap内存映射Read通过内核缓冲区来读取数据;而mmap通过把设备文献映射到内存中,绕过了内核缓冲区,最快的磁盘访问往往还是慢于最慢的内存访问,所以mmap方式加速了I/O访问此外,mmap系统调用使得进程之间通过映射同一文献实现共享内存,各进程可以像访问普通内存同样对文献进行访问,访问时只需要使用指针而不用调用文献操作函数由于mmap的以上优点,所以在程序实现中采用了内存映射方式,即mmap方式运用mmap方式视频裁取具体进行操作如下
①先使用ioctl grab_fd,VIDIOCGMBUF,grab_vm函数获得摄像头存储缓冲区的帧信息,之后修改voideojnmap中的设立,例如重新设立图像帧的垂直及水平分辨率、彩色显示格式可运用如下语句grab_buf.height=240;grab_buf.width=320;字串8grab buf.format=VIDE0_PALETTE_RGB24;
②接着把摄像头相应的设备文献映射到内存区,具体使用grabdata=unsignedchar*mmap0,grab_vm.size,PR0T_READ|PR0T_WRITE,MAP_SHARED,grad_fd,0操作这样设备文献的内容就映射到内存区,该映射内容区可读可写并且不同进程间可共享该函数成功时返回映像内存区的指针,挫败时返回值为T
七、下面对单帧采集和连续帧采集进行说明
八、*单帧采集在上面获取的摄像头存储缓冲区帧信息中,最多可支持的帧数frames的值一般为两帧对于单帧采集只需设立grab_buf.frame=0,即采集其中的第一帧,使用ioctlgrab_fd,VIDIOCMCAPTURE,grab_buf函数,若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的接着使用ioctl grab_fd,VIDIOCSYNC,frame函数鉴定该帧图像是否截取完毕,成功返回表达截取完毕,之后就可把图像数据保存成文献的形式
九、测试与实现1仔细检查设备的连接,打开电源;2在PC机上的浏览器中地址栏输入开发板地址,网页自动跳到开发板的首页;3在页面上可见摄像头采集到的视频信息
十、经验证,本次设计基本达成设计规定
十一、设计心得
十二、本次课程设计通过运用嵌入式技术,图形解决技术等,完毕了网络视频的采集过程,进一步熟悉了交叉编译的开发方法,在开发的过程中,碰到很多问题,如驱动无法加载,程序调试犯错等,通过重新编译开发板内核、安装图形。
个人认证
优秀文档
获得点赞 0