ARM Linux V4L2 Camera 实验

发布于:2025-02-22 ⋅ 阅读:(14) ⋅ 点赞:(0)

使用 ov2640

V4L2 是 Video for linux two 的简称,是 Linux 内核中视频类设备的一套驱动框架,为视频类设备驱动 开发和应用层提供了一套统一的接口规范

使用 V4L2 设备驱动框架注册的设备会在 Linux 系统/dev/目录下生成对应的设备节点文件,设备节点的 名称通常为 videoX

一、主程序

int main(int argc, char *argv[])
{
    if (2 != argc) {
        fprintf(stderr, "Usage: %s <video_dev>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /* 初始化LCD */
    if (fb_dev_init())
        exit(EXIT_FAILURE);

    /* 初始化摄像头 */
    if (v4l2_dev_init(argv[1]))
        exit(EXIT_FAILURE);

    /* 枚举所有格式并打印摄像头支持的分辨率及帧率 */
    v4l2_enum_formats();
    v4l2_print_formats();

    /* 设置格式 */
    if (v4l2_set_format())
        exit(EXIT_FAILURE);

    /* 初始化帧缓冲:申请、内存映射、入队 */
    if (v4l2_init_buffer())
        exit(EXIT_FAILURE);

    /* 开启视频采集 */
    if (v4l2_stream_on())
        exit(EXIT_FAILURE);

    /* 读取数据:出队 */
    v4l2_read_data();       //在函数内循环采集数据、将其显示到LCD屏

    exit(EXIT_SUCCESS);
}

二、函数编写

2. 初始化摄像头

3. 枚举所有格式

4.  打印摄像头支持的分辨率及帧率

5. 设置格式和流参数 

6. 初始化帧缓冲

 

7.  开启视频采集

ioctl(int fd, VIDIOC_STREAMON, int *type); //开启视频采集 
ioctl(int fd, VIDIOC_STREAMOFF, int *type); //停止视频采集 
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

8. 读取数据

出队

ioctl(int fd, VIDIOC_DQBUF, struct v4l2_buffer *buf); 
// 数据处理完之后、再入队、往复
ioctl(v4l2_fd, VIDIOC_QBUF, &buf);

 

9. 结束视频采集

enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
 
if (0 > ioctl(fd, VIDIOC_STREAMOFF, &type)) { 
 perror("ioctl error"); 
 return -1; 
} 

三、测试

交叉编译上述代码,通过 nfs 挂载到 指定目录下。

加载 ov2640 驱动后,运行程序并指定设备:

 


网站公告

今日签到

点亮在社区的每一天
去签到