1、v4l2查看设备列表
打开终端,输入:v4l2-ctl --list-devices
usb设备在Webcam: Webcam
栏,分别是video9
和video10
,下一步:确定哪一个是接入的相机
或者进入/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;
}