大家好,我aiku,最近在做一个linux摄像头的应用程序,主要功能是:arm板子210跑linux系统,进行摄像头视频采集,捕获一帧视频然后保存成图片。功能很简单,但是我确搞了很久,过程中遇到了很多问题,在此写下点滴记录以备忘,还有很多问题待决解……
硬件平台:arm cotex-A8(s5pv210开发板) + ov3640 CMOS摄像头
软件平台: (1)开发平台:xp系统上装的virtualbox-2.6.8虚拟机 + ubuntu12.04
(2)arm板子系统:linux 2.6.35 内核 + qtopia文件系统
一、摄像头程序:
1、源代码:camera3640.c
- #include "classroom.h"
- /*******************************************************************************************************************************************************************/
- extern char * chpt_lcd_mmap_addr; //lcd的缓存指针
- extern unsigned int int_lcd_width; //lcd的宽度
- extern unsigned int int_lcd_height; //lcd的高度
- extern unsigned int int_lcd_pixel; //lcd的像素
- extern unsigned int cameratimes; //Camera采集的次数控制变量
- extern const unsigned int camMaxtime; //Camera最多采集的次数
- struct buffer // 每个缓冲帧的数据结构
- {
- void * start;
- size_t length;
- }*buffers;
- const char * CameraName = "/dev/video0"; //摄像头设备名
- int cam_fd = -1; //摄像头打开文件
- static int n_buffers = 0;
- unsigned int times = 0;
- unsigned int bufferLenth = 0;
- /*******************************************************************************************************************************************************************/
- void cameraOpen(void)
- {
- cam_fd = open( CameraName, O_RDWR | O_NONBLOCK, 0 ); //阻塞方式打开摄像头
- if(cam_fd < 0)
- {
- printf("Open fimc0 error.\n");
- exit(1);
- }
- }
- void cameraInit(void)
- {
- struct v4l2_capability cap;
- int ret = 0;
- unsigned int min;
- struct v4l2_input input;
- ret = ioctl( cam_fd, VIDIOC_QUERYCAP, &cap );
- if( ret < 0 )
- {
- printf("set VIDIOC_QUERYCAP error.\n");
- exit(1);
- }
- if( !(cap.capabilities & V4L2_CAP_STREAMING) )
- {
- printf("%s can not streaming.\n");
- exit(1);
- }
- input.index = 0;
- if ((ioctl(cam_fd, VIDIOC_S_INPUT, &input)) < 0) //单输入模式
- {
- printf("set s_input error.\n");
- exit(1);
- }
- //设置视频的格式
- struct v4l2_format fmt;
- CLEAR(fmt);
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //数据流类型,永远是:V4L2_BUF_TYPE_VIDEO_CAPTURE
- fmt.fmt.pix.width = int_lcd_width;