Linux小相机(利用V4L2接口编写,保存格式为Mat)

这段时间一直在做Linux视觉相关的学习,一直弄不清楚V4L2相关的操作。所以本着学习的态度,制作一个Linux小相机。本次工程是基于正原子的i.IMX6null开发板+USB免驱摄像头+任意显示屏。至于为什么要转为Mat格式呢?因为在后期进行深度学习时,利用OpenCV来处理是非常方便的。

目录

一、编写V4L2相关代码

1、打开摄像头,利用open函数来打开,fd句柄用于判断开启状态。

2、获取摄像头支持的格式,可以查看摄像头支持的格式,用于第三步设置摄像头抓图格式

3、设置摄像头相关格式,相关格式可以在第二部打印出来,我这里设置的是MJPEG格式,大家根据自己摄像头来设置。

4、申请内核缓冲区队列映射到用户空间,也就是向内核申请一个位置用于存放数据

5、把内核的缓冲区映射到用户空间

6、开始采集,VIDIOC_STREAMON(开始采集写数据到队列中)

7、提取数据,并且将数据转为Mat格式。

8、停止采集、释放空间

二、利用封装好的函数进行显示

三、利用按键输入来进行拍照


一、编写V4L2相关代码

编写这一部分的代码需要一定的文件IO基础,能够明白open、ioctl等等基础知识。整体流程就是

1、打开摄像头,利用open函数来打开,fd句柄用于判断开启状态。

    if(argc != 2)
    {
        printf("plese input camrea_dev!\n");
        return -1;
    }
    printf("按下key0进行拍照!\n");
    //1、打开摄像头
    int fd = open(argv[1], O_RDWR);
    if(fd < 0)
    {
        perror("open camrea fail!");
        return -1;
    }

2、获取摄像头支持的格式,可以查看摄像头支持的格式,用于第三步设置摄像头抓图格式

	struct v4l2_fmtdesc  vfmts;
	vfmts.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

	int ret  = ioctl(fd, VIDIOC_ENUM_FMT, &vfmts);
	if(ret < 0)
	{
		perror("获取设备支持格式VIDIOC_ENUM_FMT失败");
		return -1;
	}
	printf("index = %d\n", vfmts.index);
	printf("%s\n", vfmts.description);

3、设置摄像头相关格式,相关格式可以在第二部打印出来,我这里设置的是MJPEG格式,大家根据自己摄像头来设置。

    //3、设置摄像头格式
    struct v4l2_format v4format;
    v4format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    v4format.fmt.pix.height = 480;
    v4format.fmt.pix.width = 640;
    v4format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; //根据自己的摄像头支持格式
    int ret = ioctl(fd, VIDIOC_S_FMT ,&v4format);
    if(ret < 0)
    {
        perror("set format fail!");
    }
    printf("set camrea format MJPEG succesful!\n");

4、申请内核缓冲区队列映射到用户空间,也就是向内核申请一个位置用于存放数据

    struct v4l2_requestbuffers requstbuffer; 
    requstbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    requstbuffer.coun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值