V4L2是一个用于Linux操作系统的视频设备驱动框架。它提供了一个统一的接口,用于在应用程序和视频设备之间进行通信和交互,可通过开源库libv4l2,opencv来控制v4l2 camera,调试前需确保camera物理链路层完整。
1.libv4l2库
(1)环境配置
#需要#include <linux/videodev2.h>,#include <libv4l2.h>,安装开发库即可
sudo apt-get update
sudo apt-get install libv4l-dev
(2)使用说明
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <libv4l2.h>
#include <opencv2/opencv.hpp>
#define WIDTH 2448
#define HEIGHT 2048
int main() {
int fd;
struct v4l2_capability v4l2Cap;
struct v4l2_format v4l2Fmt;
struct v4l2_requestbuffers v4l2ReqBuf;
struct v4l2_buffer v4l2Buf;
enum v4l2_buf_type v4l2BusType;
std::string devStr = std::string("/dev/video11");
std::cout << "cur dev:" << devStr << std::endl;
// 打开设备
fd = v4l2_open(devStr.c_str(), O_RDWR);
if (fd == -1) {
std::cerr << "open dev failed!" << std::endl;
return 1;
}
// 查询设备能力
if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &v4l2Cap) == -1) {
std::cerr << "ioctl VIDIOC_QUERYCAP failed" << std::endl;
v4l2_close(fd);
return 1;
}
std::cout << "Driver: " << v4l2Cap.driver << std::endl;
std::cout << "Card: " << v4