当前位置:   article > 正文

粤嵌gec6818开发板-驱动usb摄像头_gec6818摄像头

gec6818摄像头

        前段时间做了一个项目,用到了linux环境下gec6818开发板驱动usb摄像头,在这里给大家分享一下。

        摄像头的操作步骤

  1. 1)打开设备
  2. 2)配置设备(采集的频率、图像宽高、图像格式)
  3. 3)在内核空间申请缓冲区队列
  4. 4)把申请好的缓冲列表----映射到用户空间
  5. 5)开始采集
  6. 6)从队列中拿出一个缓冲区
  7. 7)从用户空间中把缓冲区的数据取走
  8. 8)把缓冲区放回队列
  9. 9)停止采集
  10. 10)释放资源
  11. 设备节点文件:/dev/video7
  12. 视频捕捉库:libapi_v4l2_arm.so
  13. 相关函数:
  14. //初始化摄像头设备
  15. int linux_v4l2_device_init(const char *dev);->打开文件,查找属性
  16. 参数: const char *dev -》 文件名
  17. 返回值: 失败-1
  18. //启动摄像头
  19. int linux_v4l2_start_capturing();
  20. //停止摄像头
  21. int linux_v4l2_stop_capturing();
  22. //卸载摄像头设备
  23. int linux_v4l2_device_uinit();
  24. //获取摄像头数据(存放jpg文件流:存放到freambuf)
  25. int linux_v4l2_get_fream(FrameBuffer *freambuf);
  26. //jpg文件流结构体
  27. typedef struct Frame_Buffer
  28. {
  29. char buf[1843200]; //图片数据缓冲区
  30. int length; //图片数据长度(字节)
  31. }FrameBuffer;

        下面是代码示例

  1. #include "main.h"
  2. //设置摄像头启动变量
  3. int video_show_flag = 0;
  4. //设置抓拍变量
  5. int take_photo_flag = 0;
  6. //声明函数pthread_create
  7. extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  8. int photo_num = 0;
  9. void *real_time_video()
  10. {
  11. //定义存储摄像头数据的jpg缓冲区
  12. struct jpg_data video_buf;
  13. //1.初始化摄像头设备
  14. linux_v4l2_yuyv_init("/dev/video7");
  15. //2.启动摄像头
  16. linux_v4l2_start_yuyv_capturing();
  17. char photo_name[20] = {0};
  18. //循环采集数据与输出
  19. while(1)
  20. {
  21. //3.获取摄像头数据(存放jpg文件流:存放到video_buf)
  22. linux_v4l2_get_yuyv_data(&video_buf);
  23. //4.把摄像头数据显示到LCD上
  24. lcd_draw_camera(0, 0, 700, 480, video_buf.jpg_data, video_buf.jpg_size);
  25. sprintf(photo_name,"photo%d.jpg",photo_num);
  26. if(take_photo_flag == 1) //进行抓拍
  27. {
  28. //创建一个新的文件
  29. //spritf();
  30. int fd = open(photo_name,O_RDWR|O_CREAT,0777);
  31. if(fd == -1)
  32. {
  33. perror("拍照失败");
  34. continue;
  35. }
  36. //将图片数据写入文件中
  37. write(fd,video_buf.jpg_data,video_buf.jpg_size);
  38. //关闭文件保存
  39. close(fd);
  40. //清空抓拍的标志位
  41. take_photo_flag = 0;
  42. photo_num++;
  43. if(photo_num > 4)
  44. photo_num = 0;
  45. }
  46. if(video_show_flag == 0)
  47. break;
  48. }
  49. //4.停止摄像头
  50. linux_v4l2_yuyv_quit();
  51. return NULL;
  52. }
  53. int cam(void)
  54. {
  55. //打开lcd屏幕
  56. lcd_open();
  57. lcd_clear();
  58. //创建一条线程实时监控
  59. pthread_t pid;
  60. int album_falg=0;
  61. int cam_flag=0;
  62. int x,y;
  63. int yanshi_flag=1;
  64. char yanshi_buff[20];
  65. cam_flag=1;
  66. printf("打开摄像头\n");
  67. pthread_create(&pid,NULL,real_time_video,NULL);
  68. video_show_flag = 1;
  69. while(1)
  70. {
  71. sprintf(yanshi_buff,"/cam%d.bmp",yanshi_flag);
  72. show_location_bmp(yanshi_buff,700,0,100,480,FB);
  73. get_xy(&x,&y);
  74. if(x > 718 && x < 800 && y > 5 && y < 70 && cam_flag==0 && yanshi_flag == 1)
  75. {
  76. cam_flag=1;
  77. printf("打开摄像头\n");
  78. pthread_create(&pid,NULL,real_time_video,NULL);
  79. video_show_flag = 1;
  80. }
  81. else if(x > 718 && x < 800 && y > 100 && y < 170 && cam_flag==0&& yanshi_flag == 1)
  82. {
  83. cam_flag=1;
  84. printf("打开摄像头\n");
  85. pthread_create(&pid,NULL,real_time_video,NULL);
  86. video_show_flag = 1;
  87. }
  88. else if(x > 718 && x < 800 && y > 209 && y < 264&& yanshi_flag == 1)
  89. {
  90. take_photo_flag = 1;
  91. printf("抓拍\n");
  92. }
  93. else if(x > 718 && x < 800 && y > 311 && y < 367&& yanshi_flag == 1)
  94. {
  95. video_show_flag = 0;
  96. printf("相册\n");
  97. album_falg=album_cam(0);
  98. if(album_falg==2) break;
  99. if(album_falg==1)
  100. {
  101. printf("打开摄像头\n");
  102. pthread_create(&pid,NULL,real_time_video,NULL);
  103. video_show_flag = 1;
  104. cam_flag=1;
  105. }
  106. }
  107. else if(x > 718 && x < 800 && y > 404 && y < 473 && yanshi_flag == 1)
  108. {
  109. printf("关闭摄像头\n");
  110. video_show_flag = 0;
  111. break;
  112. }
  113. else if(x > 0 && x < 700 && y > 0 && y < 480)
  114. {
  115. yanshi_flag++;
  116. if(yanshi_flag ==2)
  117. yanshi_flag = 0;
  118. }
  119. if(yanshi_flag==0)
  120. {
  121. if(x > 714 && x < 798 && y > 16 && y < 116)//延时
  122. {
  123. }
  124. if(x > 714 && x < 798 && y > 168 && y < 212)//开始
  125. {
  126. sleep(3);
  127. take_photo_flag = 1;
  128. printf("抓拍\n");
  129. }
  130. if(x > 714 && x < 798 && y > 264 && y < 312)//相册
  131. {
  132. yanshi_flag=1;
  133. sprintf(yanshi_buff,"/cam%d.bmp",yanshi_flag);
  134. show_location_bmp(yanshi_buff,700,0,100,480,FB);
  135. video_show_flag = 0;
  136. printf("相册\n");
  137. album_falg=album_cam(0);
  138. if(album_falg==2) break;
  139. if(album_falg==1)
  140. {
  141. printf("打开摄像头\n");
  142. pthread_create(&pid,NULL,real_time_video,NULL);
  143. video_show_flag = 1;
  144. cam_flag=1;
  145. }
  146. }
  147. if(x > 714 && x < 798 && y > 365 && y < 410)//关闭
  148. {
  149. printf("关闭摄像头\n");
  150. video_show_flag = 0;
  151. break;
  152. }
  153. }
  154. printf("x=%d,y=%d\n",x,y);
  155. }
  156. // //关闭lcd屏幕
  157. // lcd_close();
  158. return 0;
  159. }
  160. int cam_touch(void)
  161. {
  162. //打开lcd屏幕
  163. lcd_open();
  164. lcd_clear();
  165. //创建一条线程实时监控
  166. pthread_t pid;
  167. int touch_flag=0;
  168. int album_falg=0;
  169. int cam_flag=0;
  170. cam_flag=1;
  171. printf("打开摄像头\n");
  172. pthread_create(&pid,NULL,real_time_video,NULL);
  173. video_show_flag = 1;
  174. while(1)
  175. {
  176. show_location_bmp("/cam1.bmp",700,0,100,480,FB);
  177. touch_flag = iic();
  178. if(touch_flag == 5)
  179. {
  180. take_photo_flag = 1;
  181. printf("抓拍\n");
  182. }
  183. else if((touch_flag == 3 ||touch_flag==4) && video_show_flag ==0)
  184. {
  185. cam_flag=1;
  186. printf("打开摄像头\n");
  187. pthread_create(&pid,NULL,real_time_video,NULL);
  188. video_show_flag = 1;
  189. }
  190. else if(touch_flag == 9)
  191. {
  192. printf("关闭摄像头\n");
  193. video_show_flag = 0;
  194. usleep(100000);
  195. break;
  196. }
  197. else if(touch_flag == 7)
  198. {
  199. video_show_flag = 0;
  200. printf("相册\n");
  201. album_falg=album_cam(1);
  202. if(album_falg==2) break;
  203. if(album_falg==1)
  204. {
  205. printf("打开摄像头\n");
  206. pthread_create(&pid,NULL,real_time_video,NULL);
  207. video_show_flag = 1;
  208. cam_flag=1;
  209. }
  210. }
  211. }
  212. // //关闭lcd屏幕
  213. // lcd_close();
  214. return 0;
  215. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号