【20240131】v4l2查询USB相机配置

1、v4l2查看设备列表

打开终端,输入:v4l2-ctl --list-devices
请添加图片描述
usb设备在Webcam: Webcam栏,分别是video9video10,下一步:确定哪一个是接入的相机

或者进入/dev/video*目录下,观察USB相机接入前后的差异。

2、查看具体设备信息

在终端输入:v4l2-ctl --list-formats-ext --device=/dev/video9(从设备列表得到的)
请添加图片描述
确定video9是接入的USB相机

3、在桌面打开USB相机

在终端输入:guvcview
请添加图片描述
设置当前设备为Webcam: Webcam,预览分辨率为640x480

4. v4l2结构体查询usb相机所有配置参数,如曝光、亮度等

以下是一个示例代码,演示如何使用v4l2库来查询相机的所有配置参数,可以根据需要输出其他控制参数的信息,比如上下限、默认值等:

/*
* 以下是一个示例代码,演示如何使用v4l2库来查询相机的所有配置参数:
*/
#include <QCoreApplication>
#include <QDebug>
#include <fcntl.h>
#include <linux/videodev2.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    int fd = open("/dev/video0", O_RDWR);
    if (fd == -1) {
        qWarning() << "Failed to open the device";
        return -1;
    }

    struct v4l2_queryctrl queryctrl;
    queryctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
    
    while (ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl) == 0) {
        if (queryctrl.type == V4L2_CTRL_TYPE_INTEGER) {
            qDebug() << "Control ID: " << queryctrl.id;
            qDebug() << "Name: " << queryctrl.name;
            // 可以根据需要输出其他控制参数的信息,比如上下限、默认值等
        }
        
        queryctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
    }

    close(fd);
    
    return a.exec();
}

5. v4l2结构体查询相机支持的格式和分辨率

以下是使用结构体逐一查询USB相机每个格式支持的分辨率,并且针对每种分辨率查询支持的帧率:

/*
* 以下是使用结构体逐一查询USB相机每个格式支持的分辨率,并且针对每种分辨率查询支持的帧率
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/videodev2.h>

int main(void)
{
    int fd;
    struct v4l2_fmtdesc format;  //像素格式
    struct v4l2_frmsizeenum framesize;  //分辨率
    struct v4l2_frmivalenum frameinterval;  //帧率

    // 打开相机设备
    fd = open("/dev/video0", O_RDWR);
    if (fd == -1) {
        perror("无法打开相机设备");
        return -1;
    }

    // 查询支持的格式
    format.index = 0;
    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    while (ioctl(fd, VIDIOC_ENUM_FMT, &format) == 0) {
        printf("格式:%s\n", format.description);

        // 查询支持的分辨率
        memset(&framesize, 0, sizeof(framesize));
        framesize.pixel_format = format.pixelformat;
        framesize.index = 0;
        while (ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &framesize) == 0) {
            if (framesize.type == V4L2_FRMSIZE_TYPE_DISCRETE) {
                printf("分辨率:%dx%d\n", framesize.discrete.width, framesize.discrete.height);

                // 查询支持的帧率
                memset(&frameinterval, 0, sizeof(frameinterval));
                frameinterval.pixel_format = format.pixelformat;
                frameinterval.width = framesize.discrete.width;
                frameinterval.height = framesize.discrete.height;
                frameinterval.index = 0;
                while (ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frameinterval) == 0) {
                    if (frameinterval.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
                        printf("帧率:%d/%d\n", frameinterval.discrete.numerator, frameinterval.discrete.denominator);
                    }
                    frameinterval.index++;
                }
            }
            framesize.index++;
        }
        format.index++;
    }

    close(fd);
    return 0;
}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 上,使用 V4L2(Video for Linux 2)接口可以实现 USB 相机的视频采集。下面是一个简单的实现过程: 1. 打开相机设备 使用 open() 函数打开相机设备文件,例如 /dev/video0。如果打开成功,则返回文件描述符。如果打开失败,则需要检查设备文件是否存在或是否拥有读写权限。 2. 查询设备信息 使用 ioctl() 函数和 VIDIOC_QUERYCAP 命令查询设备信息,包括设备名称、设备类型、支持的视频格式等。 3. 配置视频格式 使用 ioctl() 函数和 VIDIOC_S_FMT 命令设置视频格式,包括图像大小、像素格式、帧率等。在设置之前,需要先查询设备支持的视频格式,以确保所设置的格式被支持。 4. 分配视频缓冲区 使用 ioctl() 函数和 VIDIOC_REQBUFS 命令请求相机分配视频缓冲区。在请求之前,需要先设置好视频格式。分配的缓冲区可以用于存储相机采集的视频数据。 5. 将缓冲区映射到用户空间 使用 mmap() 函数将缓冲区映射到用户空间,以便用户程序可以直接访问缓冲区。 6. 开始视频采集 使用 ioctl() 函数和 VIDIOC_STREAMON 命令启动视频采集。此时,相机会不断采集视频数据,并将数据存储到缓冲区中。 7. 读取视频数据 使用 read() 函数从缓冲区中读取视频数据,然后进行处理或显示。读取数据之前,需要先使用 select() 函数或 poll() 函数等待相机数据就绪。 8. 停止视频采集 使用 ioctl() 函数和 VIDIOC_STREAMOFF 命令停止视频采集。此时,相机不再采集视频数据。 9. 释放缓冲区 使用 munmap() 函数解除缓冲区的映射,并使用 ioctl() 函数和 VIDIOC_REQBUFS 命令释放缓冲区。 10. 关闭相机设备 使用 close() 函数关闭相机设备文件。 以上是一个简单的 USB 相机视频采集的实现过程。实际实现中,可能需要考虑更多的细节问题,例如错误处理、图像处理、多线程操作等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值