远程视频监控程序设计实验指导

上传人:沈*** 文档编号:127879255 上传时间:2022-07-31 格式:DOC 页数:47 大小:852.50KB
收藏 版权申诉 举报 下载
远程视频监控程序设计实验指导_第1页
第1页 / 共47页
远程视频监控程序设计实验指导_第2页
第2页 / 共47页
远程视频监控程序设计实验指导_第3页
第3页 / 共47页
资源描述:

《远程视频监控程序设计实验指导》由会员分享,可在线阅读,更多相关《远程视频监控程序设计实验指导(47页珍藏版)》请在装配图网上搜索。

1、远程视频监控程序设计摄像头采集驱动移植(在2.4核平台下:此环节可以省略)移植gspcav1-1224 gspcav1-1224下载地址:由于linux-2.6.24.4/drivers/usb 目录下没有 media 目录,故移植环节如下:a) 在 linux-2.6.24.4/drivers/usb 目录下新建 media 目录,将gspcav1-1224.tar.gz copy 到 media 下并解压。为了使media 编译进内核,需修改linux-2.6.24.4/drivers/usb 目录下的Kconfig、Makefile 文献。rootvm-dev usb$ pwd/work

2、/kernel/linux-2.6.24.4/drivers/usbrootvm-dev usb$ vi Kconfig添加source drivers/usb/media/Kconfigrootvm-dev usb$ vi Makefile添加obj-$(CONFIG_USB_SPCA5XX) += media/b) 为添加 gspcav1-1224 编译选项,在 media 下新建 Kconfig、Makefile 文献。rootvm-dev media$ pwd/work/kernel/linux-2.6.24.4/drivers/usb/mediarootvm-dev media$ v

3、i Kconfig# USB Multimedia device configuration#comment USB Multimedia devices depends on USBconfig USB_SPCA5XX tristate USB SPCA5XX Sunplus/Vimicro/Sonix jpeg Cameras depends on USB & VIDEO_DEV -help- Say Y or M here if you want to use one of these webcams: The built-in microphone is enabled by sele

4、cting USB Audio support. This driver uses the Video For Linux API. You must say Y or M to Video For Linux (under Character Devices) to use this driver. Information on this API and pointers to v4l programs may be found at . To compile this driver as a module, choose M here: the module will be called

5、spca5xx.rootvm-dev media$ vi Makefile# Makefile for USB Media drivers#obj-$(CONFIG_USB_SPCA5XX) += gspcav1-1224/c) 修改 gspcav1-1224 的 Makefilerootvm-dev gspcav1-1224$ pwd/work/kernel/linux-2.6.24.4/drivers/usb/media/gspcav1-1224rootvm-dev gspcav1-1224$ vi Makefilegspca-objs := gspca_core.o decoder/gs

6、pcadecoder.oobj-$(CONFIG_USB_SPCA5XX) += gspca.oclean: rm -f *.oas .*.flags *.ko .*.cmd .*.d .*.tmp *.mod.c rm -rf .tmp_versionsd) 编译内核(1)Multimedia devices - Video For Linux(2) USB support - Support for Host-side USB - USB Host Controller Drivers OHCI HCD support(3)- USB Multimedia devices USB SPCA

7、5XX Sunplus/Vimicro/Sonix jpeg Cameras2、此时,也许会提示 gspca_core.c 的某些轻微错误,稍作修改即可:/static const char gspca_version = GSPCA_VERSION;static const char gspca_version = 00.60.00;把新生成的 uImage 烧进开发板,重启,插上中星微芯片的摄像头,命令行浮现# usb 1-1: new full speed USB device using s3c2410-ohci and address 2 usb 1-1: configuration

8、 #1 chosen from 1 choice drivers/usb/media/gspcav1-1224/gspca_core.c: USB GSPCA camera found.(ZC3XX)阐明移植的驱动已经能辨认设备,设备名所在途径 /dev/video0。摄像头采集应用程序接口(V4L接口),接口函数编写(可以直接将mouse_capture.tar.bz2文献到/home/文献下,解压缩 #tar xjvf mouse_capture.tar.bz2完毕解压成mouse_capture-daily3,运营此文献夹下的make,在arm机在能看到的spca5xx.o videod

9、ev.o的位置上打上spca5xx.o videodev.o两个驱动。insmod videodev.oinsmod spca5xx.o./mouse_capture到/var/tmp/ 下看到与否有1.jpg图片,必须有,否则错。再看video0有无:)一、Video4linux 简介Video4Linux是为市场目前常用的电视捕获卡和并口及USB口的摄像头提供统一的编程接口。同步也提供无线电通信和文字电视广播解码和垂直消隐的数据接口。本文重要针对USB摄像头设备文献/dev/video0,进行视频图像采集方面的程序设计。二、Video4linux 编程指南1.视频编程的流程(1)打开视频设

10、备:(2)读取设备信息(3)更改设备目前设立(可以不做)(4)进行视频采集,两种措施:a.内存映射b.直接从设备读取(5)对采集的视频进行解决(6)关闭视频设备。定义的数据构造及使用函数struct _v4l_structint fd;struct video_capability capability;struct video_buffer buffer;struct video_window window;struct video_channel channel8;struct video_picture picture;struct video_mmap mmap;struct vide

11、o_mbuf mbuf;unsigned char *map;typedef struct _v4l_struct v4l_device;extern int v4l_open(char *, v4l_device *);extern int v4l_close(v4l_device *);extern int v4l_get_capability(v4l_device *);extern int v4l_set_norm(v4l_device *, int);extern int v4l_get_picture(v4l_device *);extern int v4l_grab_init(v

12、4l_device *, int, int);extern int v4l_grab_frame(v4l_device *, int);extern int v4l_grab_sync(v4l_device *);extern int v4l_mmap_init(v4l_device *);extern int v4l_get_mbuf(v4l_device *);extern int v4l_get_picture(v4l_device *);extern int v4l_grab_picture(v4l_device *, unsigned int);extern int v4l_set_

13、buffer(v4l_device *);extern int v4l_get_buffer(v4l_device *);extern int v4l_switch_channel(v4l_device *, int);3.Video4linux支持的数据构造及其用途(1)video_capability 涉及设备的基本信息(设备名称、支持的最大最小辨别率、信号源信息等)name32 设备名称maxwidthmaxheightminwidthminheightChannels 信号源个数type 与否能capture , 彩色还是黑白, 与否能裁剪等等。值如VID_TYPE_CAPTURE等(

14、2)video_picture 设备采集的图象的多种属性Brightness 065535huecolourcontrastwhitenessdepth 8 16 24 32palette VIDEO_PALETTE_RGB24 | VIDEO_PALETTE_RGB565|VIDEO_PALETTE_JPEG| VIDEO_PALETTE_RGB32(3)video_channel 有关各个信号源的属性Channel 信号源的编号nametunersType VIDEO_TYPE_TV | IDEO_TYPE_CAMERANorm 制式 PAL|NSTC|SECAM|AUTO(4)video

15、_window 包具有关capture area的信息x x windows 中的坐标.y y windows 中的坐标.width The width of the image capture.height The height of the image capture.chromakey A host order RGB32 value for the chroma key.flags Additional capture flags.clips A list of clipping rectangles. (Set only)clipcount The number of clippin

16、g rectangles. (Set only)(5)video_mbuf 运用mmap进行映射的帧的信息size 每帧大小Frames 最多支持的帧数Offsets 每帧相对基址的偏移(6)video_mmap 用于mmap4.核心环节简介【注】接多种摄像头。措施如下:买一种usb hub接到开发板的usb host上。cat/proc/devices可以懂得video capture device的major是81,再ls l /dev看到video0的次设备号是0。两个摄像头固然要两个设备号,因此mknod /dev/video1 c 81 1,如果接4个,就mknod /dev/vid

17、eo2 c 81 2,mknod /dev/video3 c 81 3。依次类推。(1)打开视频:int v4l_open(char *dev, v4l_device *vd)if (!dev)dev = ”/dev/video0”;if (vd -fd = open(dev, O_RDWR) fd, VIDIOCGCAP, &(vd-capability) capability各分量(3)读video_picture中信息int v4l_get_picture(v4l_device *vd)if (ioctl(vd -fd, VIDIOCGPICT, &(vd-picture) pictur

18、e.colour = 65535;if(ioctl(vd-fd, VIDIOCSPICT, &(vd-picture) capability中的信息int v4l_get_channels(v4l_device *vd)int i;for (i = 0; i capability.channels; i+) vd -channeli.channel = i;if (ioctl(vd -fd, VIDIOCGCHAN, &(vd-channeli) fd);return 0;重点:截取图象的两种措施一、用mmap(内存映射)方式截取视频mmap( )系统调用使得进程之间通过映射同一种一般文献实现

19、共享内存。普通文献被映射到进程地址空间后,进程可以向访问一般内存同样对文献进行访问,不必再调用read(),write()等操作。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。采用共享内存通信的一种显而易见的好处是效率高,由于进程可以直接读写内存,而不需要任何数据的拷贝(1)设立picture的属性(2) 初始化video_mbuf,以得到所映射的buffer的信息ioctl(vd-fd, VIDIOCGMBUF, &(vd-mbuf)(3)可以修改video_mmap和帧状态的目前设立(4)将

20、mmap与video_mbuf绑定void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )len:映射到调用进程地址空间的字节数,它从被映射文献开头offset个字节开始算起Prot:指定共享内存的访问权限 PROT_READ(可 读), PROT_WRITE (可写),PROT_EXEC (可执行)Flags:MAP_SHARED MAP_PRIVATE中必选一种,MAP_ FIXED不推荐使用Addr:共内存享的起始地址,一般设0,表达由系统分派Mmap( ) 返回值是系统实

21、际分派的起始地址int v4l_mmap_init(v4l_device *vd)if (v4l_get_mbuf(vd) map = mmap(0, vd-mbuf.size, PROT_READ|PROT_WRITE,MAP_SHARED, vd-fd, 0) fd, VIDIOCMCAPTURE, &(vd-mmap) ;若调用成功,开始一帧的截取,是非阻塞的,与否截取完毕留给VIDIOCSYNC来判断(6)调用VIDIOCSYNC等待一帧截取结束if(ioctl(vd-fd, VIDIOCSYNC, &frame) map + vd-mbuf.offsetsvd-frame得到。采集工

22、作结束后调用munmap取消绑定munmap(vd-map, vd-mbuf.size)在实际应用时还可以采用缓冲队列等方式。二、视频截取的第二种措施:直接读设备有关缓冲大小,图象等的属性须由使用者事先设立调用read();int read (要访问的文献描述符;指向要读写的信息的指针;应当读写的字符数);返回值为实际读写的字符数int len ;unsigned char*vd-map=(unsigned char *) malloc(vdcapability.maxwidth*vdcapability.maxheight );len = read(vdfd,vd vd-map,vdcapa

23、bility.maxwidth*vdcapability.maxheight*3 );2.3 编程实例(mouse_capture)zc301是采集jpeg编码的位流,mouse_capture是根据servfox改编的一种专门从zc301摄像头获取一张jpeg图片,用来测试摄像头与否加载成功的小程序。这样就可以不用cat /dev/video01.jpg来测试摄像头与否正常。cat命令一运营,就源源不断地采集jpeg流。但是采到的图片只能显示第一种jpeg头和jpeg尾之间的数据。mouse_capture仅仅获得一张完整的jpeg。 可以从()处下载参照。现将重要函数的功能简介如下:sta

24、tic int GetVideoPict (struct vdIn *vd);/获取图片属性信息。static int SetVideoPict (struct vdIn *vd);/设立图片属性。static int isSpcaChip (const char *BridgeName);/测试芯片类型static int GetStreamId (const char *BridgeName); /测试输出数据的格式static int GetDepth (int format);/获取颜色深度。void exit_fatal(char *messages);/错误显示。int init_

25、videoIn(struct vdIn *vd,char *device,int width,int height,int format,intgrabmethod);/初始化设备。int convertframe(unsigned char *dst,unsigned char *src, int width,int height, intformatIn, int size);/把共享缓冲区中的数据放到一种变量中,告知系统已获得一帧。int v4lGrab (struct vdIn *vd,char *filename );/从摄像头采集图片。int close_v4l (struct v

26、dIn *vd);/关闭摄像头。int get_jpegsize (unsigned char *buf, int insize);/获取jpeg图片大小。核心代码分析:(server.c)#include #include #include #include spcav4l.h struct vdIn videoIn; int main (int argc, char *argv) char videodevice = /dev/video0; char jpegfile = /var/tmp/1.jpg;/采集图片到本地目录 int grabmethod = 0;/修改为0才可以记录图片到

27、/var/tmp/1.jpg int format = VIDEO_PALETTE_JPEG; int width = 352; int height = 288; memset(&videoIn, 0, sizeof (struct vdIn); if(init_videoIn(&videoIn, videodevice, width, height, format,grabmethod)= 0) while(1) v4lGrab(&videoIn, jpegfile); if(grabmethod=1) printf(you use mmap method!n); else if(grab

28、method=0) printf(you use read method!n); printf(you have get a picture in %sn,jpegfile); else printf(cant open your camera!n); close_v4l (&videoIn); return 0;可将该文献拷贝到pc上进行查看 这里有关应用程序的编译措施,就不再多讲了,只需要make重新编译一下就好!下面我们再简介如何讲采集图片直接显示到本地LCD,我们会用到jpeg的类库到/var/tmp/看有无图片,如没有运营摄像头程序看看摄像头与否正常工作。在arm机在能看到的spca

29、5xx.o videodev.o的位置上打上spca5xx.o videodev.o两个驱动。(注意顺序)insmod videodev.o(如果此从别处考过去的,它是白色,那要写:chmod +x videodev.o 将此加入此工程,此时为黄色)insmod spca5xx.o 即:后运营看到图像。如自己make 需要修改Makefile文献:即:(或者先查内核地址:然后修改Makefile的LDFLAG:如图:)编译JPEG库环境(注意仔细配,否则make install之后,负责图形图像的libjpeg.so.62.0.0库不能用,我图形可以用,但图像不能用。就是用刘工的)一、实验环节

30、1、获取jpeg-6b源代码直接从我们提供的配套光盘中获取。得到jpeg-6b.ok.tar.bz2(#tar xjvf jpeg-6b.ok.tar.bz2完毕)后,运营如下命令解压:cd /opt/develop/lyj/up_apthome/webcamtar jxvf jpeg-6b.ok.tar.bz2此时,在目前目录下就涉及了我们所需要的源码jpeg-6b目录 2、配备jpeg库从光盘获取的源码解压之后,在jpeg-6b中会有一种build.sh文献rootvm-dev jpeg-6b# cat build.sh ./configure -prefix=/mnt/nfs/jpeg4

31、arm -exec-prefix=/mnt/nfs/jpeg4arm -enable-shared -enable-staticrootvm-dev jpeg-6b# ./build.sh下面分别简介这几种参数的作用:?-prefix=/mnt/nfs/jpeg4arm:执行makeinstall后,会将与体系无关的文献拷贝到此目录下,具体如下:/mnt/nfs/jpeg4arm.|+-include.|-jconfig.h|-jerror.h|-jmorecfg.h|-jpeglib.h+-man.|+-man1.|-cjeg.1|-djpeg.1|-jpegtran.1|-rdjpgcom

32、.1|-wrjpgcom.1-exec-prefix=/mnt/nfs/jpeg4arm:执行makeinstall后,会将与体系无关的文献拷贝到此目录下,即将某些可执行程序、动态链接库和静态链接库拷贝到此目录的相应目录下,具体如下:/mnt/nfs/jpeg4arm.|+-bin.|-cjeg|-djpeg|-jpegtran|-rdjpgcom|-wrjpgcom+-lib.|-libjpeg.la|-libjpeg.so|-libjpeg.so.62|-libjpeg.so.62.0.0-enable-shared:用GNUlibtool编译成动态链接库。下面分别相应有无此参数所生成的M

33、akefile的比较:-无-enable-shared参数|有-enable-shared参数-LIBTOOL=|LIBTOOL=./libtool-O=oA=a|O=loA=la-LN=$(CC)|LN=$(LIBTOOL)-mode=link$(CC)-INSTALL_PROGRAM=$INSTALL|INSTALL_PROGRAM=$(LIBTOOL)-mode=install$INSTALLINSTALL_LIB=$INSTALL-m644|INSTALL_LIB=$(LIBTOOL)-mode=install$INSTALL-无参数:#.c.lo:#$(LIBTOOL)-mode=c

34、ompile$(CC)$(CFLAGS)-c$(srcdir)/$*.c有参数:.c.lo:$(LIBTOOL)-mode=compile$(CC)$(CFLAGS)-c$(srcdir)/$*.c-无参数:install:cjpegdjpegjpegtranrdjpgcomwrjpgcom有参数:install:cjpegdjpegjpegtranrdjpgcomwrjpgcominstall-lib-3、修改生成的Makefile文献#ThenameofyourCcompiler:CC=gcc该成CC=/usr/local/arm-linux/bin/arm-linux-gcc(根据你自己

35、交叉编译器的位置修改)(需要安装arm-linux-gcc,)#library(.a)filecreationcommandAR=arrc该成AR=/usr/local/arm-linux/arm-linux/bin/arrc(同上)#secondstepin.acreation(usetouchifnotneeded)AR2=ranlib该成AR2=/usr/local/arm-linux/arm-linux/bin/ranlib(同上)4、编译安装rootvm-dev jpeg-6b# make cleanrootvm-dev jpeg-6b# make要手动建立如下文献并在man下要建一

36、种man1文献夹rootvm-dev jpeg-6b# make installrootvm-dev jpeg-6b#这样JPEG库就交叉编译成功了,相应的库和头文献都/mnt/nfs/jpeg4arm/下了!rootvm-dev jpeg-6b# ls /mnt/nfs/jpeg4arm/bin include lib manrootvm-dev jpeg-6b#有关jpeg库的使用,在源代码中example.c文献中又具体的阐明,也可以参照这篇文章了。获取图像数据到LCD设备(我就是用jpegshow.tar.bz2文献)实验环节1、从光盘获取源代码,解压缩进入/opt/develop/l

37、yj/up_apthome/webcam目录rootvm-dev webcam# tar -vxjf jpegshow.final.tar.bz2rootvm-dev webcam# lsjpegshow rootvm-dev webcam#解压后的目录在jpegshow文献夹下2、代码分析 修改Makefile使include和lib指向自己的途径。(黑体文字要根据自己include,lib途径修改)rootvm-dev jpegshow# cat Makefileall:main.o arm-linux-gcc -I/mnt/nfs/jpeg4arm/include -L/mnt/nfs/

38、jpeg4arm/lib -I/home/oyx/porting/curl-7.18.2/_install/include -L/home/oyx/porting/curl-7.18.2/_install/lib -lcurl -o myjpeg main.o fb.o jpeg.o getHttpFile.o -ljpeg main.o:fb.o jpeg.o arm-linux-gcc -I/mnt/nfs/jpeg4arm/include -L/mnt/nfs/jpeg4arm/lib -c main.cfb.o:fb.c fb.h arm-linux-gcc -c fb.cjpeg.o

39、:jpeg.c jpeg.h getHttpFile.o arm-linux-gcc -I/mnt/nfs/jpeg4arm/include -L/mnt/nfs/jpeg4arm/lib -c jpeg.cgetHttpFile.o:getHttpFile.c getHttpFile.h arm-linux-gcc -I/home/oyx/porting/curl-7.18.2/_install/include -L/home/oyx/porting/curl-7.18.2/_install/lib -lcurl -c getHttpFile.cclean: rm -rf *.o myjpe

40、grootvm-dev jpegshow#这里使用gcc编译的时候,要使用-I 指向前两个实验编译的代码安装的inlcude目录使用-L执行前两个实验编译的代码安装的lib目录并使用 l 表达使用的是哪个库分析mian.crootvm-dev jpegshow# cat main.c #include fb.h#include jpeg.h int main() unsigned char * fb_mem; unsigned char buffer1000000;/创立一种寄存数据的buffer int i,j,fb; unsigned char * data; fb = fb_open()

41、;/获取framebuffer的设备句柄 fb_mem = fb_mmap(fb);/获取指向frambuffer的指针 while(1)/数据通过网络获取之后,先通过jpeg解码,然后寄存在buffer中 if(!read_JPEG_file(/var/tmp/1.jpg,buffer,640,480) printf(main return err); return 0; return 1; rootvm-dev jpegshow#3、重点分析read_JPEG_file()函数(篇幅因素,去掉了某些注释和调试信息) (不需要改)/jpeg.c文献中int read_JPEG_file (c

42、har * filename,unsigned char *mem,int width, int height) int i,j,line,output_width; unsigned short* fb_mem = (unsigned short*)mem; char indata1000000; int nSize; int width_offset; int height_offset; /* This struct contains the JPEG decompression parameters and pointers to * working space (which is a

43、llocated as needed by the JPEG library). */ struct jpeg_decompress_struct cinfo; /* We use our private extension JPEG error handler. * Note that this struct must live as long as the main JPEG parameter * struct, to avoid dangling-pointer problems. */ struct my_error_mgr jerr; /* More stuff */ FILE *

44、 infile; /* source file */ JSAMPARRAY buffer; /* Output row buffer */ int row_stride; /* physical row width in output buffer */ /* In this example we want to open the input file before doing anything else, * so that the setjmp() error recovery below can assume the file is open. * VERY IMPORTANT: use

45、 b option to fopen() if you are on a machine that * requires it in order to read binary files. */ /* Step 1: allocate and initialize JPEG decompression object */ /1、分派并初始化一种JPEG解压对象 /* We set up the normal JPEG error routines, then override error_exit. */ cinfo.err = jpeg_std_error(&jerr.pub); jerr.

46、pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ if (setjmp(jerr.setjmp_buffer) /* If we get here, the JPEG code has signaled an error. * We need to clean up the JPEG object, close the input file, and return. */ jpeg_destroy_decompress(&cinfo); retu

47、rn 0; /* Now we can initialize the JPEG decompression object. */ jpeg_create_decompress(&cinfo); /* Step 2: specify data source (eg, a file) */2、指定要解压缩的图像文献: jpeg_stdio_src(&cinfo,infile); /* Step 3: read file parameters with jpeg_read_header() */3、调用jpeg_read_header()获取图像信息: (void) jpeg_read_header(&cinfo, TRUE); /* We can ignore the return value from jpeg_read_header since * (a) suspension is not possible with the stdio data source, and * (b) we passed

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!