这段时间一直在做Linux视觉相关的学习,一直弄不清楚V4L2相关的操作。所以本着学习的态度,制作一个Linux小相机。本次工程是基于正原子的i.IMX6null开发板+USB免驱摄像头+任意显示屏。至于为什么要转为Mat格式呢?因为在后期进行深度学习时,利用OpenCV来处理是非常方便的。
目录
1、打开摄像头,利用open函数来打开,fd句柄用于判断开启状态。
2、获取摄像头支持的格式,可以查看摄像头支持的格式,用于第三步设置摄像头抓图格式
3、设置摄像头相关格式,相关格式可以在第二部打印出来,我这里设置的是MJPEG格式,大家根据自己摄像头来设置。
4、申请内核缓冲区队列映射到用户空间,也就是向内核申请一个位置用于存放数据
6、开始采集,VIDIOC_STREAMON(开始采集写数据到队列中)
一、编写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

最低0.47元/天 解锁文章
3399

被折叠的 条评论
为什么被折叠?



