V4L2 ioctl说明

#include <linux/videodev2.h>               
/*头文件*/
    

struct v4l2_capability cap;
ioctl(fd, VIDIOC_QUERYCAP, &cap);
/*查询 video设备的类型摄像头一般是VIDEO_CAPTURE*/
/* Values for 'capabilities' field */
#define V4L2_CAP_VIDEO_CAPTURE		0x00000001  /* Is a video capture device */
#define V4L2_CAP_VIDEO_OUTPUT		0x00000002  /* Is a video output device */
#define V4L2_CAP_VIDEO_OVERLAY		0x00000004  /* Can do video overlay */
#define V4L2_CAP_VBI_CAPTURE		0x00000010  /* Is a raw VBI capture device */
#define V4L2_CAP_VBI_OUTPUT		    0x00000020  /* Is a raw VBI output device */
#define V4L2_CAP_SLICED_VBI_CAPTURE	0x00000040  /* Is a sliced VBI capture device */
#define V4L2_CAP_SLICED_VBI_OUTPUT	0x00000080  /* Is a sliced VBI output device */
#define V4L2_CAP_RDS_CAPTURE		0x00000100  /* RDS data capture */



struct v4l2_fmtdesc fmt;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
fmt.index = i;
ioctl(fd, VIDIOC_ENUM_FMT, &fmt);
/*查询video设备支持的格式类型比如 YUV420*/


struct v4l2_frmsizeenum frmsize;
frmsize.pixel_format = fmt.pixelformat;
frmsize.index = j;
ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
/*图像的分辨率等输据*/
   
struct v4l2_format format;
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
format.fmt.pix.width = WIDTH;              
format.fmt.pix.height = HEIGHT;             
format.fmt.pix.pixelformat = FMT;           
ioctl(fd, VIDIOC_S_FMT, &format);
ioctl(fd, VIDIOC_G_FMT, &format);     
/*获取当前或者重新设定采集的图像格式*/

  
    
struct v4l2_requestbuffers reqbuf;
reqbuf.count = COUNT;                      
reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
reqbuf.memory = V4L2_MEMORY_MMAP;           
ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
/*通知video driver 申请内存摄像头一般是vediobuf api vb2_core_reqbufs*/


struct v4l2_buffer buff;
buff.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buff.memory = V4L2_MEMORY_MMAP;
ioctl(fd, VIDIOC_QUERYBUF, &buff);
datas = mmap(NULL, buff.length, PROT_READ, MAP_SHARED, fd, buff.m.offset);
/*获取分配的内存的物理地址并mmap出一个user地址供应用程序使用*/
/*datas放到文件里既是采集到的图像文件*/

ioctl(fd, VIDIOC_QBUF, &buff);    
ioctl(fd, VIDIOC_DQBUF, &buff);
/*从VIDIOC_REQBUFS申请到的buf 入队出队到图像采集队列里*/
/*Applications call the VIDIOC_QBUF ioctl to enqueue an empty (capturing)*/
/*or filled (output) buffer in the driver’s incoming queue*/


int on = V4L2_BUF_TYPE_VIDEO_CAPTURE;       
ioctl(fd, VIDIOC_STREAMON, &on);      
/*开始图像采集*/
     


第一章 V4L2简介 — Linux V4L2 drafticon-default.png?t=LBL2https://work-blog.readthedocs.io/en/latest/v4l2%20intro.html

在给Qt项目中使用v4l2 ioctl的时候,需要包含相关的头文件并链接相应的库。根据提供的引用内容,可以看到在main.cpp文件中包含了QApplication和widget.h头文件,而在h文件中包含了一些与v4l2相关的头文件,如fcntl.h、unistd.h、string.h、linux/videodev2.h等。这些头文件提供了使用v4l2 ioctl所需的函数和结构体的定义。同时,在V4L2类中也使用了一些v4l2相关的函数和结构体。 因此,要在Qt项目中使用v4l2 ioctl,需要确保在.pro文件中添加了对v4l2库的链接,可以通过在.pro文件中添加`LIBS += -lv4l2`来实现。这样可以确保在编译和链接阶段能够正确使用v4l2 ioctl相关的函数和结构体。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [jetson-nano qt v4l2采集 拍照 实时显示 调整曝光 zbar 二维码识别](https://blog.csdn.net/ourkix/article/details/107175905)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Linux QT 使用V4L2打开摄像头获取图像](https://blog.csdn.net/yuchunhai321/article/details/104295221)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenhuxi_yu

感谢投币,继续输出

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值