基于AT91RM9200的图像采集系统设计
一个图像发送线程负责图像发送,程序通过建立带共享锁的4帧图像循环队列做为图像采集线程和图像发送线程进行数据交换的公共缓冲区。服务端还使用了两个socket,一个用于和服务端口绑定后侦听是否有服务请求,另外一个用于发送图像数据,主线程流程如图3所示。
程序首先设置采集图像的相关参数(如设备号、图像大小、初始化图像帧缓冲区等),然后通过函数 int init_videoIn()获取摄像头参数,设置采集图像宽度、高度、格式、采集方式等参数,并分配4帧采集图像缓存 vd->ptframe[i] =(unsigned char *) realloc (vd->ptframe[i], sizeof(struct frame_t) + (size_t) vd->framesizeIn ),再启动图像采集线程 pthread_create (w1, NULL, (void *) grab, NULL)进行图像采集;创建服务端socket,与服务端口绑定后侦听服务请求;如果有新连接进来,函数accept()返回一个新的发送 socket,并启动新的图像发送线程,pthread_create(server_th, NULL, (void *)service, new_sock); 如果采集结束或连接产生错误,调用pthread_join (w1, NULL)和close(serv_sock)关闭图像采集线程和图像发送线程,释放有关资源后退出。
图3.主程序流程
采集方式 | READ | 内存映射 | ||
分辨率 | 640×480 | 320×240 | 640×480 | 320×240 |
JPEG图像大小(KB) | 32 | 7 | 32 | 7 |
图像采集时间(ms) | 56 | 16 | 40 | 12 |
采集发送速度(帧/s) | 15 | 50 | 22 | 60 |
表1.实验结果
使用奥尼银色天使S900摄像头分别对640×480和320×240两种分辨率用read方式和内存映射方式进行了图像采集和发送,实验结果如表1所示,应用程序采用内存映射方式图像获取的实时性较高,达到实时视频的要求。
4结束语
本文针对市场主流USB摄像头开发了驱动程序,实现了基于AT91RM9200的嵌入式图像采集和网络传输。克服了其它图像采集方案采集BMP图像数据量大和实时性差的问题,并解决了目前嵌入式Linux缺乏USB摄像头驱动程序的问题,具有集成度和性价比高、实时性好、支持多种USB摄像头和充分利用USB带宽的优点。实验表明适于高质量实时图像监控场所和智能图像监控应用,具有很好的广泛应用前景。
参考文献:
[1]ATMEL, AT91RM9200 DATA,[Z]. America, Atmel Corporation , 2003.
[2](美)科比特、鲁宾尼、哈特曼主编,LINUX设备驱动程序[M],东南大学出版社,2004
[3]周力功 主编 ,USB编程与驱动程序开发[M],北京航空航天大学,2004
[4]李侃,基于S3C2410平台与嵌入式Linux图像采集应用[J],微计算机信息,2006,第3-2期
[5]Don Anderson、Dave Dzatko 著,USB系统体系[M],中国电力出版社,2003
[6]倪继利著,LINUX 内核分析及编程[M],电子工业出版社,2005
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)