Linux V4L2框架的视频采集

本文介绍V4L2摄像头采集程序的实现步骤,包括打开摄像头设备、查询硬件信息及支持的采集格式等关键环节,并详细解析了相关数据结构如v4l2_capability和v4l2_fmtdesc。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、流程

V4L2摄像头采集程序步骤

  1. 打开摄像头设备
  2. 查询摄像头硬件信息
  3. 显示摄像头支持的采集格式
  4. 设置采集格式
  5. 申请内核空间
  6. 映射
  7. 开始采集

二、模块

2.1 打开摄像头

int OpenCameraDevice(char* filename,int mode)
{
    int Camera_fd = open(filename, mode);
	if (Camera_fd < 0)
	{
		perror("Failed to open camera device");
		printf("\n");
        return -1;//表示函数失败
	}else{
        return Camera_fd;
    }
    return 0;
}

2.2 查询硬件设备的能力

2.2.1  struct v4l2_capability结构体

struct v4l2_capability {

__u8 driver[16]; //驱动名   通常为:uvcvideo

__u8 card[32]; //设备名   生产厂商写

__u8 bus_info[32]; //在Bus系统中存放位置 ,通常为:usb-hiusb-ehci-2.4

__u32   version; //driver 版本

__u32 capabilities;

//设备支持的操作模式,能力集 通常为:V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING

__u32 device_caps;

__u32 reserved[3];// 保留字段

};

 capabilities 代表设备支持的操作模式,常见的值有 V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING 表示是一个视频捕捉设备并且具有数据流控制模式;

能力集中包含:

V4L2_CAP_VIDEO_CAPTURE 0x00000001     The device supports the Video    Capture interface.

V4L2_CAP_VIDEO_OUTPUT   0x00000002     The device supports the Video    Output interface.

V4L2_CAP_VIDEO_OVERLAY 0x00000004     The device supports the Video    Overlay interface.

int QueryCameraHardwareInfo(int fd)
{
    struct v4l2_capability cap;
    memset(&cap, 0, sizeof(cap));
    int ret = 0;
    ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
    if (ret < 0)
	{
		printf("VIDIOC_QUERYCAP failed(%d)\n", ret);
        return -1;
	}
    else
	{
		printf("Capability Informations:\n");
        /*cout<<"driver:"<<cap.driver<<endl;
        cout<<"card:"<<cap.card<<endl;
        cout<<"bus_info:"<<cap.bus_info<<endl;
        cout<<"version:"<<cap.version<<endl;
        cout<<"capabilities:"<<cap.capabilities<<endl;
        cout<<"device_caps:"<<cap.device_caps<<endl;
        cout<<"reserved:"<<cap.reserved<<endl;*/
	}
	printf("--------------------\n");		//可作为分割线。
	return ret;
}

2.3 打印摄像头支持的格式   

2.3.1 struct v4l2_fmtdesc结构体

struct v4l2_fmtdesc

{

u32 index; // 要查询的格式序号,应用程序设置

enum v4l2_buf_type type; // 缓冲类型 应用程序设置  帧类型,应用程序设置

u32 flags; // 是否为压缩格式

u8 description[32]; // 格式名称

u32 pixelformat; // 格式

u32 reserved[4]; // 保留

};

参数enum v4l2_buf_type type:

enum v4l2_buf_type {
	V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,
	V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,
	V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,
	V4L2_BUF_TYPE_VBI_CAPTURE          = 4,
	V4L2_BUF_TYPE_VBI_OUTPUT           = 5,
	V4L2_BUF_TYPE_SLICED_VBI_CAPTURE   = 6,
	V4L2_BUF_TYPE_SLICED_VBI_OUTPUT    = 7,
	V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
	V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,
	V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE  = 10,
	V4L2_BUF_TYPE_SDR_CAPTURE          = 11,
	V4L2_BUF_TYPE_SDR_OUTPUT           = 12,
	V4L2_BUF_TYPE_META_CAPTURE         = 13,
	/* Deprecated, do not use */
	V4L2_BUF_TYPE_PRIVATE              = 0x80,
};

参数u32 flags:

参数description:

参数pixelformat:

2.4 设置采集的格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_42475191

谢谢老板

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

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

打赏作者

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

抵扣说明:

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

余额充值