linux系统V4L2架构OV3640摄像头视频捕获保存图片jpg格式

本文档记录了在Linux系统下,使用arm板子和OV3640摄像头进行视频采集并保存为JPEG图片的过程。首先介绍了硬件和软件平台,然后详细阐述了摄像头程序的执行流程,包括设备打开、初始化、内存映射、视频捕获等步骤,并提到了可能出现的错误及解决方法。此外,还提供了保存JPEG图片的程序代码,涉及图像参数设置和JPEG压缩过程。
摘要由CSDN通过智能技术生成

大家好,我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

  1. #include "classroom.h"
  2. /*******************************************************************************************************************************************************************/
  3. extern char * chpt_lcd_mmap_addr; //lcd的缓存指针
  4. extern unsigned int int_lcd_width; //lcd的宽度
  5. extern unsigned int int_lcd_height; //lcd的高度
  6. extern unsigned int int_lcd_pixel; //lcd的像素
  7. extern unsigned int cameratimes; //Camera采集的次数控制变量
  8. extern const unsigned int camMaxtime; //Camera最多采集的次数
  9. struct buffer // 每个缓冲帧的数据结构
  10. {
  11. void * start;
  12. size_t length;
  13. }*buffers;
  14. const char * CameraName = "/dev/video0"; //摄像头设备名
  15. int cam_fd = -1; //摄像头打开文件
  16. static int n_buffers = 0;
  17. unsigned int times = 0;
  18. unsigned int bufferLenth = 0;
  19. /*******************************************************************************************************************************************************************/
  20. void cameraOpen(void)
  21. {
  22. cam_fd = open( CameraName, O_RDWR | O_NONBLOCK, 0 ); //阻塞方式打开摄像头
  23. if(cam_fd < 0)
  24. {
  25. printf("Open fimc0 error.\n");
  26. exit(1);
  27. }
  28. }
  29. void cameraInit(void)
  30. {
  31. struct v4l2_capability cap;
  32. int ret = 0;
  33. unsigned int min;
  34. struct v4l2_input input;
  35. ret = ioctl( cam_fd, VIDIOC_QUERYCAP, &cap );
  36. if( ret < 0 )
  37. {
  38. printf("set VIDIOC_QUERYCAP error.\n");
  39. exit(1);
  40. }
  41. if( !(cap.capabilities & V4L2_CAP_STREAMING) )
  42. {
  43. printf("%s can not streaming.\n");
  44. exit(1);
  45. }
  46. input.index = 0;
  47. if ((ioctl(cam_fd, VIDIOC_S_INPUT, &input)) < 0) //单输入模式
  48. {
  49. printf("set s_input error.\n");
  50. exit(1);
  51. }
  52. //设置视频的格式
  53. struct v4l2_format fmt;
  54. CLEAR(fmt);
  55. fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //数据流类型,永远是:V4L2_BUF_TYPE_VIDEO_CAPTURE
  56. fmt.fmt.pix.width = int_lcd_width;
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值