基于mini2440的USB视频采集_第1页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于mini2440的usb视频采集基于mini2440的usb视频采集 在嵌入式系统中,视频采集主要采纳两种接口:一种是标准摄像头接口,一种是usb接口(usb1.1)。标准的摄像头接口,接口复杂,但传输速度快,适合高质量视频采集,而usb接口,接口容易,但有性能瓶颈,只能用于低质量的视频采集。mini2440开发板采纳的是s3c2440芯片,s3c2440自带了一个ohci的usb1.1主机接口和一个cmos摄像头标准接口。所以mini2440开发板的两种视频采集方式都可以,这里主要介绍基于usb接口的视频采集。由于前一段时光编写了主机上基于gtk的usb视频采集程序,现在需要将其移植到开

2、发板上。 按照主机与开发板环境的不同,需要移植的部分主要就是视频显示部分。在主机上视频显示程序是调用gtk的库函数,而在开发板上有众多的ui可以挑选,可以基于qt或者基于minigui 做显示界面,但是最容易最挺直的方式就是操作frambuffer设备显示,由于这样可以避开gui函数带来的性能损失,挺直看到采集的实际效果,但这种方式只适用于试验程序没有太大的有用价 ,我的采集程序程序就是采纳了这种方式。usb摄像头采纳和主机程序测试一样的摄像头(十几块钱的山寨摄像头),视频输出 式为yuyv,接口为usb2.0接口兼容usb1.1。为了避开线程切换带来的性能损失,在程序中我去掉了显示以及采集线

3、程,主程序采纳大循环的结构。下面容易的介绍一下程序: 1 主函数 int main(int argc, const char* argv) int fp = 0; unsign int i; * init suct camera struct camera *cam; /这个是我自定义的结构,代表一个摄像头,定义在v4l2.h中 struct val tpstart,tpend; float timeuse; /以上变量是为了统计每帧采集的时光 unsigned short *pbuf; /帧缓存地址 cam = malloc(sizeof(struct camera); if (!cam)

4、printf( malloc camera failure!n it(1); cam- device_name = /dev/veo0 cam- buffers = null; cam- width = image_width; cam- height = image_height; cam- display_depth = 3; /* rgb24 */ cam- rgbbuf = malloc(cam- width * cam- height * cam- display_depth); if (!cam- rgbbuf) printf( malloc rgbbuf failure!n ex

5、it(1); open_camera(cam); get_cam_cap(cam); get_cam_pic(cam); get_cam_win(cam); cam- video_win.width = cam- width; cam- video_win.height = cam- height; _cam_win(cam); close_camera(cam); open_camera(cam); get_cam_win(cam); init_camera(cam); start_capturing (cam); /以上初始化摄像头,设置采集图像格式为yuyv,采集图像大小为image_w

6、idth×image_height,mmap方式读取数据 fp = fb_init ( /dev/fb0 /打开初始化frambuffer设备,用mmap映射帧缓存地址为fbbuf if (fp 0) printf( error : can not open framebuffer devicen exit(1); pbuf = (unsigned short *)fbbuf; for (i = 0; i 320 *240; i+) pbufi = make_pixel(0, 0x0, 0x0, 0xff); /清屏成蓝色 ifdef debug_gtime gettimeofday

7、( tpstart,null); endif for (;) if (read_frame (cam) draw_image(pbuf, cam- rgbbuf); /将采集的数据显示到屏幕上 ifdef debug_gtime gettimeofday( tpend,null); timeuse = 1000000 * (tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_usec - tpstart.tv_usec); timeuse /= 1000000; printf( u time:%10f sn ,timeuse); gettimeofday( t

8、pstart,null); endif /以上用gettimeofday函数统计采集一帧的时光 return 0; 主函数主要初始化摄像头,分配数据结构,为视频采集做预备。然后初始化frambuffer设备,映射帧缓存,为视频显示做预备。主函数调用的v4l2接口函数与主机测试程序几乎一样。与主机测试程序不同的是显示程序draw_image,它用来显示一帧图像。 2 draw_image 函数 ic void draw_image(unsigned short *pbuf, unsigned char *buf) unsigned int x,y; unsigned int pixel_num;

9、 if (window_w = 240) for (y = window_y; y window_y + window_h; y+) for (x = window_x; x window_x + window_w; x+) pixel_num = (y - window_y) * image_width + x - window_x) * 3; pbufy * 240 + x = make_pixel(0, (unsigned int)bufpixel_num, (unsigned int)bufpixel_num + 1, (unsigned int)bufpixel_num + 2);

10、ee /* reverse */ for (x = 0; x window_w; x+) for (y = 0; y window_h; y+) pixel_num = (y * image_width + x) * 3; pbufx * 240 + y = make_pixel(0, (unsigned int)bufpixel_num, (unsigned int)bufpixel_num + 1, (unsigned int)bufpixel_num + 2); 这个函数作用就是显示一帧图像,由于在程序初始化阶段已经映射了帧缓存fbbuf,所以只需要将一帧图像的数据capy到帧缓存处就可

11、以显示到l上了。在程序的开头处定义了一组宏。 define image_width 320 /采集视频的宽度 define image_height 240 /采集视频的高度 define window_w 176 /显示视频的宽度 define window_h 144 /显示视频的高度 define window_x 40 /显示起始横坐标 define window_y 60 /显示起始纵坐标 这样通过这一组宏就可以调节显示图像的大小与位置,由于mini2440的lcd为240 × 320 的竖屏,而摄像头采集回归的最大图像大小为320 × 240 ,所以这里用了一个

12、技巧。假如显示的图像宽度大于240,那么就将屏幕翻转,这样可以更好的显示。由于在yuv422转rgb的函数中,转换出的rgb 式为rgb24,而mini2440的屏幕为rgb16的,所以需要做一个色彩转换。 static inline int make_pixel(unsigned int a, unsigned int r, unsigned int g, unsigned int b) return (unsigned int)(r 3) 11) | (g 2) 5 | (b 3); 这个函数就是将rgb24 式转换成rgb16的 式。 3 性能分析 以上程序可以正确的举行摄像头的视频采集

13、与显示,但是最大只能采集到176 × 144 的低质量图像,假如采集辨别里达到320 * 240 图像会十分卡,有显然的延迟与丢帧现象,这种缘由是usb1.1每秒所传的帧数有限造成的。usb1.1最大每秒可传的帧数由图像大小和usb速度共同打算。下面以320×240 yuyv 式的图像为例,计算usb1.1最大每秒可传的帧数。 (1)每帧需要传输的数据量为 320 × 240 × 2 × 8 = 1228800bit = 1.2288mbit (2)usb协议规定:usb1.1的最大传输比特率为12m也就是每秒传12mbit。这只是理论上的数据

14、,实际传输也就10m左右。我们以10mbps为例 (3)usb协议规定:同步传输不得超过总线的带宽的90%,所以传扬速度还得乘以0.9,为9mbps。 (4)usb传输速度包括了协议相关的位,usb协议规定usb同步传输包,每个包的协议信息为9个字节。每秒帧数还与每个usb帧(1ms)传输的包的数量有关系,这与同步端点的最大数据有关系,我的摄像头同步端点最大数据为8字节。所以每个包的数据与协议数据比就是 8 : 9, 这样一来带宽还得乘以一个 8/17,为4.2353mbps (5) 最后算出每秒帧数据就是 4.2353 / 1.2288 = 3.4 以上计算没有考虑sof包,以及usb位填充,以及其他的因素,粗略的算出,对于320×240的一幅yuyv 式的图像,usb1.1最大每秒传输3.4帧。可谓是十分小了,但这只是理论的 ,实际我用gettimeofday测出的惟独每秒一帧多,这样的速度不卡才怪。所以最后得出的结论就是:因为usb1.1的速度限制,采纳usb1.1做图像采集,在usb摄像头输出 式为未的原始数据(如:rgb,yuv)的前提下只能采集到低辨别率,低质量的画面。基本上不能用于产品,

温馨提示

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

评论

0/150

提交评论