网站导航: 首页 > 设计参考 > 正文 文章搜索
基于嵌入式linux和s3c2410平台的视频采集
 
文章编号:
090105113648
文章分类: 单片机 ARM
点 击:
...
关 键 词: linux,s3c2410,视频
文章来源:
网络
摘 要:
随着多媒体技术、网络技术的迅猛发展和后PC机时代的到来,利用嵌入式系统实现远程视频监控、可视电话和视频会议等应用已成为可能。为了实现这些应用,实时获得视频数据是一个重要环节。针对这一点,本文在基于嵌入式

  (2)采集程序实现过程

  首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数grab_fd =open ("/dev/video0",O_RDWR),grab_fd是设备打开后返回的文件描述符(打开错误返回-1),以后的系统调用函数就可使用它来对设备文件进行操作了。接着,利用ioct1(grab_fd,VIDIOCGCAP,&grab_cap)函数读取struct video_capability中有关摄像头的信息。该函数成功返回后,这些信息从内核空间拷贝到用户程序空间grab_cap各成员分量中,使用 printf函数就可得到各成员分量信息,例如printf("maxheight=%d",grab_fd.maxheight)获得最大垂直分辨率的大小。不规则用ioct1(grab_fd,VIDIOCGPICT,&grab_pic)函数读取摄像头缓冲中voideo_picture信息。在用户空间程序中可以改变这些信息,具体方法为先给分量赋新值,再调用VIDIOCSPICT ioct1函数,例如:

  grab_fd.depth=3;

  if(ioct1(grab_fd,VIDIOCSPICT,&grab_pic)<0)

  {perror("VIDIOCSPICT");return -1;};

  完成以上初始化设备工作后,就可以对视频图像截取了,有两种方法:一种  是read()直接读取;另外一种 mmap()内存映射。Read ()通过内核缓冲区来读取数据;而mmap()通过把设备文件映射到内存中,绕过了内核缓冲区,最快的磁盘访问往往还是慢于最慢的内存访问,所以mmap ()方式加速了I/O访问。另外,mmap()系统调用使得进程之间通过映射同一文件实现共享内存,各进程可以像访问普通内存一样对文件进行访问,访问时只需要使用指针而不用调用文件操作函数。因为mmap()的以上优点,所以在程序实现中采用了内存映射方式,即mmap()方式。

  利用mmap()方式视频裁取具体进行操作如下。

  ①先使用ioct1(grab_fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式。可利用如下语句

  grab_buf.height=240;

  grab_buf.width=320;

  grab_buf.format=VIDEO_PALETTE_RGB24; 

  ②接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*)mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。这样设备文件的内容就映射到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回映像内存区的指针,挫败时返回值为-1。

  下面对单帧采集和连续帧采集进行说明:

  *单帧采集。在上面获取的摄像头存储缓冲区帧信息中,最多可支持的帧数(frames的值)一般为两帧。对于单帧采集只需设置 grab_buf.frame=0,即采集其中的第一帧,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf) 函数,若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的。接着使用ioct1(grab_fd,VIDIOCSYNC,&frame) 函数判断该帧图像是否截取完毕,成功返回表示截取完毕,之后就可把图像数据保存成文件的形式。

  *连续帧采集。在单帧的基础上,利用grab_fd.frames值确定采集完毕摄像头帧缓冲区帧数据进行循环的次数。在循环语句中,也是使用 VIDIOCMCCAPTURE ioct1和VIDIOCSYNC ioctl函数完成每帧截取,但要给采集到的每帧图像赋地址,利用语句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要继续采集可再加一个外循环,在外循环语句只要给原来的内循环再赋frame=0即可。

  4 小结

  笔者最后在宿主机PC上使用交叉编译器编译链接连续帧采集程序(以双帧采集为例并保存成bmp文件文件形式)使之生成可执行代码,并完成了向目标平台的移植。为了进一步观察采集的图像效果,笔者在目标平台带网络支持的基础上,编写了一个简单的网络通信程序,把采集到并保存为bmp的图像文件通过网络传输到PC机上进行显示,把采集到并保存为bmp的图像文件通过网络传输到PC机上进行显示,通过对效果的分析,再回到采集程序中重新设置 video_picture中的信息,如亮度、对比度等和voide_mmap中的分辨率,重新移植以达到最好效果为准。

  嵌入式系统平台上,应用本文所述方法完成视频采集工作,再加上相关的视频处理并接入网络,就构成了一个智能终端设备,可用于工厂、银行及小区等场合全天候的智能监控,具有广阔的市场和应用前景

 
相关文章:
s3c2410 Timer工作原理[图]
虚拟SPI时序在TC77与S3C2410通信中的应用[图]
s3c2410 MMU(存储器管理单元)讲解[图]
s3c2410 CACHES,WRITE BUFFER讲解[图]
S3C2410中的脉宽调制定时器(PWM)
S3C2410 中断程序的实现
s3c2410 watchdog详解
s3c2410 中断异常处理[图]
基于ARM9芯片S3C2410a的GPRS数据终端设计
ARM系统中DMA方式在数据采集中的应用[图]
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现[图]
基于s3c2410的ARMer9开发平台的使用
ARM S3C2410硬件手册重点
基于ARM S3C2410与TMS320C6416的接口设计[图]
S3C2410上Jffs2的移植
ARM S3C2410驱动TFT-LCD的研究[图]
MINIGUI在S3C2410开发板的移植
mplayer在S3C2410上的移植
在S3C2410上移植yaffs2文件系统
S3C2410 bootloader(vivi)阅读笔记
s3c2410 LCD图片显示
S3C2410 LCD 驱动程序移植及GUI程序编写[图]
S3C2410X开发总结及心得
U-Boot在S3C2410开发板上的移植
用AXD 和Multi-ICE调试uClinux内核
用AXD 在线调试uClinux-2.4.x操作系统
S3C44B0 调试笔记—uClinux
基于ARM-uCLinux嵌入式系统启动引导的实现
S3C2410初始化
S3C2410通过IIS总线与音频芯片UDA1380进行通信
在S3C2410上移植bluetooth(蓝牙)
S3c2410软件调试总结
S3C2410上触摸屏的应用实例
S3c2410的触摸屏及模数转换
S3C2410的快速启动技术
关于三星S3C44B0X目标板的uClinux Bootloader
一步一步制作arm-linux 交叉编译环境
S3c2410 LCD驱动学习心得
uclinux平台下ucd-snmp的编译
RT73 USB无线网卡驱动在armlinux平台上的移植实例
Linux内核同步机制-自旋锁
s3c2410移植MPlayer到linux2.6

上一页 12
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4