linux使用v4l2打开本机摄像头附代码
时间: 2024-07-16 16:00:21 浏览: 157
linux下利用v4l2打开本地摄像头
Linux中使用V4L2(Video for Linux, 2nd version)API来访问摄像头是非常常见的做法,因为V4L2是一个标准接口,支持各种类型的视频设备,包括摄像头。以下是一个简单的示例,展示如何使用C语言通过libv4l2库打开并读取摄像头的帧:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/v4l2.h>
#define CAMERA_DEV "/dev/video0" // 根据你的实际情况修改
int main() {
int camera_fd = -1;
struct v4l2_capability cap;
struct v4l2_format fmt;
struct v4l2_request_format req;
// 打开摄像头设备
if ((camera_fd = open(CAMERA_DEV, O_RDWR | O_NONBLOCK)) < 0) {
perror("Opening camera device failed");
return 1;
}
// 获取设备信息
if (ioctl(camera_fd, VIDIOC_QUERYCAP, &cap) < 0) {
perror("Querying camera capabilities failed");
close(camera_fd);
return 1;
}
printf("Camera name: %s\n", cap.driver);
// 设置视频格式
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420p; // 可以根据需求选择其他格式
fmt.fmt.pix.width = cap.capabilities.fmt.pix.max_width;
fmt.fmt.pix.height = cap.capabilities.fmt.pix.max_height;
req.request = V4L2_REQUEST_FORMAT;
req.param = &fmt;
if (ioctl(camera_fd, VIDIOC_S_FMT, &req) < 0) {
perror("Setting video format failed");
close(camera_fd);
return 1;
}
printf("Format set: %dx%d @ %d Hz\n", fmt.fmt.pix.width, fmt.fmt.pix.height, fmt.fmt.pix.field);
// 读取和处理视频帧
while (true) {
struct v4l2_buffer buf;
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = 0;
if (ioctl(camera_fd, VIDIOC_DQBUF, &buf) == -EAGAIN) {
// 如果没有可用的缓冲区,等待一段时间再尝试
usleep(100000); // 100ms delay
continue;
}
// 处理接收到的视频帧
// 这里仅作示例,实际应用中需要解码和显示帧数据
printf("Processing frame... \n");
if (ioctl(camera_fd, VIDIOC_QBUF, &buf) < 0) {
perror("Queuing buffer failed");
}
}
close(camera_fd);
return 0;
}
```
注意,这个例子假设你的系统已经安装了libv4l2,并且摄像头设备是/dev/video0。如果不同,你需要修改CAMERA_DEV变量。此外,对于更复杂的项目,可能还需要处理错误、缓冲区管理以及帧的解码和显示等部分。
阅读全文