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

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

        摄像头的操作步骤

1)打开设备
2)配置设备(采集的频率、图像宽高、图像格式)
3)在内核空间申请缓冲区队列
4)把申请好的缓冲列表----映射到用户空间
5)开始采集
6)从队列中拿出一个缓冲区
7)从用户空间中把缓冲区的数据取走
8)把缓冲区放回队列
9)停止采集
10)释放资源

设备节点文件:/dev/video7

视频捕捉库:libapi_v4l2_arm.so

相关函数:

    //初始化摄像头设备
    int linux_v4l2_device_init(const char *dev);->打开文件,查找属性
        参数: const char *dev -》 文件名
        返回值: 失败-1
    //启动摄像头
    int linux_v4l2_start_capturing();
    //停止摄像头
    int linux_v4l2_stop_capturing();
    //卸载摄像头设备
    int linux_v4l2_device_uinit();
    //获取摄像头数据(存放jpg文件流:存放到freambuf)
    int linux_v4l2_get_fream(FrameBuffer *freambuf);
    //jpg文件流结构体
typedef struct Frame_Buffer
    {
        char buf[1843200];            //图片数据缓冲区
        int length;                    //图片数据长度(字节)
        
    }FrameBuffer;

        下面是代码示例

#include "main.h"

//设置摄像头启动变量
int video_show_flag = 0;
//设置抓拍变量
int take_photo_flag = 0;
//声明函数pthread_create
extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

int photo_num = 0;

void *real_time_video()
{
	//定义存储摄像头数据的jpg缓冲区
	struct jpg_data video_buf;
	
	//1.初始化摄像头设备
	linux_v4l2_yuyv_init("/dev/video7");
	
	//2.启动摄像头
	linux_v4l2_start_yuyv_capturing();

	char photo_name[20] = {0};
	
	//循环采集数据与输出
	while(1)
	{
		//3.获取摄像头数据(存放jpg文件流:存放到video_buf)
		linux_v4l2_get_yuyv_data(&video_buf);
		
		//4.把摄像头数据显示到LCD上
		lcd_draw_camera(0, 0, 700, 480, video_buf.jpg_data, video_buf.jpg_size);
		sprintf(photo_name,"photo%d.jpg",photo_num);

		if(take_photo_flag == 1)	//进行抓拍
		{
			//创建一个新的文件
            //spritf();
			int fd = open(photo_name,O_RDWR|O_CREAT,0777);
			if(fd == -1)
			{
				perror("拍照失败");
				continue;
			}
			//将图片数据写入文件中
			write(fd,video_buf.jpg_data,video_buf.jpg_size);
			//关闭文件保存
			close(fd);
			//清空抓拍的标志位
			take_photo_flag = 0;

			photo_num++;
			if(photo_num > 4)
				photo_num = 0;
		}
		if(video_show_flag == 0)
			break;
	}
	
	//4.停止摄像头
	linux_v4l2_yuyv_quit();

	return NULL;
}


int cam(void)
{
	//打开lcd屏幕
	lcd_open();
	lcd_clear();

	
	
	//创建一条线程实时监控
	pthread_t pid;
	int album_falg=0;
	int cam_flag=0;
	int x,y;
	int yanshi_flag=1;
	char yanshi_buff[20];
	cam_flag=1;
	printf("打开摄像头\n");
	pthread_create(&pid,NULL,real_time_video,NULL);
	video_show_flag = 1;

	while(1)
	{
		sprintf(yanshi_buff,"/cam%d.bmp",yanshi_flag);
		show_location_bmp(yanshi_buff,700,0,100,480,FB);
		get_xy(&x,&y);
		if(x > 718 && x < 800 && y > 5 && y < 70 && cam_flag==0 && yanshi_flag == 1)
		{				
			cam_flag=1;
			printf("打开摄像头\n");
			pthread_create(&pid,NULL,real_time_video,NULL);
			video_show_flag = 1;
		}
		else if(x > 718 && x < 800 && y > 100 && y < 170 && cam_flag==0&& yanshi_flag == 1)
		{
			cam_flag=1;
		    printf("打开摄像头\n");
			pthread_create(&pid,NULL,real_time_video,NULL);
			video_show_flag = 1;
		}
		else if(x > 718 && x < 800 && y > 209 && y < 264&& yanshi_flag == 1)
		{
		    take_photo_flag = 1;	
			printf("抓拍\n");

		}
		else if(x > 718 && x < 800 && y > 311 && y < 367&& yanshi_flag == 1)
		{
			video_show_flag = 0;
		    printf("相册\n");
			album_falg=album_cam(0);
			if(album_falg==2) break;
			if(album_falg==1)
			{
				printf("打开摄像头\n");
				pthread_create(&pid,NULL,real_time_video,NULL);
				video_show_flag = 1;
				cam_flag=1;
			}
		}
		else if(x > 718 && x < 800 && y > 404 && y < 473 && yanshi_flag == 1)
		{
		    printf("关闭摄像头\n");
			video_show_flag = 0;
            break;
		}
		else if(x > 0 && x < 700 && y > 0 && y < 480)
		{
			yanshi_flag++;
			if(yanshi_flag ==2)
				yanshi_flag = 0;
		}

		if(yanshi_flag==0)
		{
			if(x > 714 && x < 798 && y > 16 && y < 116)//延时
			{
				
			}
			if(x > 714 && x < 798 && y > 168 && y < 212)//开始
			{
				sleep(3);
				take_photo_flag = 1;	
				printf("抓拍\n");
			}
			if(x > 714 && x < 798 && y > 264 && y < 312)//相册
			{
				yanshi_flag=1;
				sprintf(yanshi_buff,"/cam%d.bmp",yanshi_flag);
				show_location_bmp(yanshi_buff,700,0,100,480,FB);
				video_show_flag = 0;
				printf("相册\n");
				album_falg=album_cam(0);
				if(album_falg==2) break;
				if(album_falg==1)
				{
					printf("打开摄像头\n");
					pthread_create(&pid,NULL,real_time_video,NULL);
					video_show_flag = 1;
					cam_flag=1;
				}
			}
			if(x > 714 && x < 798 && y > 365 && y < 410)//关闭
			{
				printf("关闭摄像头\n");
				video_show_flag = 0;
				break;
			}
		}
		
		printf("x=%d,y=%d\n",x,y);
	}
	
	
	// //关闭lcd屏幕
	// lcd_close();
	return 0;
}


int cam_touch(void)
{
	//打开lcd屏幕
	lcd_open();
	lcd_clear();
	
	//创建一条线程实时监控
	pthread_t pid;
    int touch_flag=0;
	int album_falg=0;
	int cam_flag=0;

	cam_flag=1;
	printf("打开摄像头\n");
	pthread_create(&pid,NULL,real_time_video,NULL);
	video_show_flag = 1;

	while(1)
	{
		show_location_bmp("/cam1.bmp",700,0,100,480,FB);
        touch_flag = iic();
		if(touch_flag == 5)
		{
			take_photo_flag = 1;	
			printf("抓拍\n");
		}
		else if((touch_flag == 3 ||touch_flag==4) && video_show_flag ==0)
		{
			cam_flag=1;
			printf("打开摄像头\n");
			pthread_create(&pid,NULL,real_time_video,NULL);
			video_show_flag = 1;
		}
		else if(touch_flag == 9)
		{
			printf("关闭摄像头\n");
			video_show_flag = 0;
            usleep(100000);
            break;
		}
		else if(touch_flag == 7)
		{
			video_show_flag = 0;
		    printf("相册\n");
			album_falg=album_cam(1);
			if(album_falg==2) break;
			if(album_falg==1)
			{
				printf("打开摄像头\n");
				pthread_create(&pid,NULL,real_time_video,NULL);
				video_show_flag = 1;
				cam_flag=1;
			}
		}
		
	}
	
	
	// //关闭lcd屏幕
	// lcd_close();
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值