Linux下V4L2实时显示摄像头捕捉画面(完整QT+C++代码)

news2024/9/29 14:51:14

目录

一、V4L2

1、简介

2、编程与应用

二、示例演示

1、例子说明:

2、关键的代码演示

3、完整的例子的代码


一、V4L2

1、简介

        V4L2,即Video for Linux Two,是Linux下关于视频设备的内核驱动框架,为驱动和应用程序提供了一套统一的接口规范。

        在Linux中,视频设备被视为设备文件,通常位于/dev/video目录下。如果只有一个视频设备,它通常是/dev/video0

2、编程与应用

(1)编程框架:V4L2是针对UVC免驱USB设备的编程框架,主要用于采集USB摄像头等。编程时,开发者可以通过ioctl函数对设备的I/O通道进行管理,使用一系列特定的命令标志符来实现不同的功能。

(2)重要数据结构:V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,如v4l2_formatv4l2_crop等,用于描述视频设备的行为和数据的格式。

(3)主要函数:通过ioctl函数和一系列特定的命令标志符(如VIDIOC_REQBUFS、VIDIOC_QUERYBUF、VIDIOC_STREAMON等),开发者可以对视频设备进行参数设置、数据采集和处理等操作。

(4)注册流程:在进行视频数据流操作之前,首先需要通过标准的字符设备操作接口open方法来打开一个video设备,并返回设备句柄。之后的一系列操作都是基于对这个句柄的操作。在打开的过程中,会给每一个子设备进行各自的一系列初始化操作。

(5)应用场景:V4L2在远程会议、可视电话、视频监控系统和嵌入式多媒体终端等领域有广泛应用。

        总之,V4L2是Linux下功能强大的视频设备驱动框架,它提供了丰富的接口和灵活的数据结构,使得开发者能够轻松地实现视频数据的采集、处理和传输等功能。

二、示例演示

1、例子说明:

在ARM系统的机器中有摄像头,要对此机器的摄像头进行开关控制,并显示在屏幕上(或者实时显示Qt的窗口上)

或者用你的虚拟机连接摄像头设备也是可以。

(1)查看机器上面的摄像机设备号

2、关键的代码演示

(1)打开设备

int CameraCapture::Camera_OpenCam(const char *devicePath)
{
    qDebug() << __FUNCTION__ << __LINE__ ;

    fd_cam = open(devicePath, O_RDWR, 0);
    if (fd_cam < 0)
    {
        qDebug() << QString("Open failed (%1), %2 ")
                    .arg(QString::fromStdString(devicePath))
                    .arg(strerror(errno));
        return -1;
    }

    qDebug() << QString("fd_cam (%1) open successfully ").arg(QString::number(fd_cam));
    return fd_cam ;

}

(2)关闭摄像头

int CameraCapture::closeCamera()
{
    qDebug() << __FUNCTION__ << __LINE__ ;

    // 防止打开程序时候,就要关闭摄像头。
    if(fd_cam == -1)
    {
        qDebug() << __FUNCTION__ << __LINE__ << "当前没有打开摄像头,直接返回。";
        return 0;
    }

    // 清空当前数据
    Camera_UNMap(framebuf1);

    qDebug() << __FUNCTION__ << __LINE__  << QString("fd_cam " + QString::number(fd_cam));

    return close(fd_cam);
}

(3)获取摄像头的相关信息

int CameraCapture::Camera_GetCamInfo()
{
    int ret=-1 ;

    // GetDevicInfo
    struct v4l2_capability cap;
    ret = ioctl(fd_cam, VIDIOC_QUERYCAP, &cap);
    if (ret < 0)
    {
        qDebug() << "VIDIOC_QUERYCAP failed: " << QString::number(ret);
        return ret;
    }

    return ret ;
}

(4)获取摄像头中视频流的数据

int CameraCapture::Camera_RequestBuffers(v4l2_requestbuffers *reqbuf__)
{
    // Request Buffers from kernel
    int ret =-1 ;
    reqbuf__->count = BUFFER_COUNT;
    reqbuf__->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    reqbuf__->memory = V4L2_MEMORY_MMAP;

    ret = ioctl(fd_cam , VIDIOC_REQBUFS, reqbuf__);

    if(ret < 0)
    {
        qDebug() << "VIDIOC_REQBUFS failed: " << QString::number(ret);
        return ret;
    }
    return ret ;
}
3、完整的例子的代码

由于代码有点长,直接上传资源,有需要自行下载。

Linux下V4L2实时显示摄像头捕捉画面(完整QT+C++代码)资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端vue-form表单的验证

form表单验证的完整步骤

Nginx反向代理配置支持websocket

一、官方文档 WebSocket proxying 为了将客户端和服务器之间的连接从HTTP/1.1转换为WebSocket&#xff0c;使用了HTTP/1.1中可用的协议切换机制&#xff08;RFC 2616: Hypertext Transfer Protocol – HTTP/1.1&#xff09;。 然而&#xff0c;这里有一个微妙之处:由于“升级”…

TLS详解

什么是TLS TLS(Transport Layer Security)传输层安全性协议 &#xff0c;它的前身是SSL(Secure Sockets Layer)安全套接层&#xff0c;是一个被应用程序用来在网络中安全的通讯协议&#xff0c; 防止电子邮件、网页、消息以及其他协议被篡改或是窃听。是用来替代SSL的&#xf…

ONFI 5.1:定义、缩写语和约定

address 该地址由一个行地址和一个列地址组成。行地址标识要访问的page、block和LUN。列地址标识要访问的page中的byte或word。 asynchronous 异步是指数据用WE_n信号进行写&#xff0c;RE_n信号进行读。 block 由多个page组成&#xff0c;是擦除操作的最小可寻址单元。 column…

稀土阻燃协效剂-磷氮系的应用

稀土阻燃协效剂凭借独特的稀土4f电子层结构,在聚合物材料燃烧时可催化酯化成炭,迅速在高分子表面形成致密连续的碳层,隔绝聚合物材料内部的可燃性气体与氧气的接触,从而达到阻燃抑烟的效果,且燃烧时不产生有毒有害气体。 金士镧系列稀土阻燃剂是一种基于稀土协效阻燃的复合阻燃…

Windows11如何关闭“显示更多选项”,直接展示所有选项

在windows11系统中&#xff0c;右击&#xff0c;会有“显示更多选项”&#xff0c;每次都要点一下这个按钮&#xff0c;才能看到所有的选项&#xff0c;太麻烦&#xff0c;那么有什么办法去掉呢&#xff1f; 1、以管理员的方式打开命令提示符 winR&#xff1b;cmd回车 执行命…

在Ubuntu和centos系统安装JDK教程

目录 1. 先使用apt 查看有哪些软件包2.使用apt安装软件包3.确认是否安装4.centos安装jdk Linux会把一些软件包&#xff0c;放到对应的服务器上&#xff0c;通过包管理器这样的程序&#xff0c;来把这些软件包下载安装 包管理器&#xff1a; Ubuntu&#xff1a;apt centos&#…

工程设备包括哪些内容?

工程设备是构成或计划构成永久工程一部分的机电设备、金属结构设备&#xff0c;仪器装置及其他类似的设备和装置。它们在工程建设中扮演着至关重要的角色&#xff0c;涵盖了从基础建设到设备安装的多个方面。以下是整理出来的一些工程设备主要的内容&#xff1a; 1. 建筑机械设…

实用好软-----电脑端 从视频中导出音频的方便工具

最近想从一个视频中导出个音乐&#xff0c;百度找很多没有合适的工具。最终找到了一款很方便 而且操作超级简单的工具。打开这个工具后只需要把需要导出音乐的视频拖进窗口里就会自动导出音乐mp3。方便小巧&#xff0c;而且音频效果还是不错的。 一些视频转换成音频文件&#x…

从零开始学习OMNeT++系列第一弹——OMNeT++的介绍与安装

最近由于由于工作上的需求&#xff0c;接了一个网络仿真的任务。于是开始调研各个仿真平台&#xff0c;然后根据目前的需求和网络上公开资料的多少&#xff0c;决定使用omnet这个网络仿真平台。现在也是刚开始学习&#xff0c;所以决定记录一下从零开始的这个学习过程。因为虽然…

社交应用性能提升秘籍:推拉结合优化方案全解读!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的老朋友小米,一个积极活泼的29岁技术分享达人~ 今天要跟大家分享的是我最近在个人项目里遇到的一个有趣的优化案例——“推拉…

OptiTrack与Xsens光、惯动捕中用于动画制作的尖端设备对比

随着动画、电影、游戏等数字内容行业的迅速发展&#xff0c;捕捉演员的动作并将其转化为虚拟角色的技术越来越受到重视。两种主要的动作捕捉技术——光学捕捉系统和惯性动作捕捉系统——代表了当前市场的最前沿。本文将对比两种技术的代表性设备&#xff1a;OptiTrack的光学动作…

Vue3 动态加载图片不显示问题

一、图片目录结构 二、批量导出图片 exportImage.ts const images import.meta.glob(/assets/icons/*.{png,jpg,jpeg,svg}, { eager: true });const imageMap Object.entries(images).reduce((acc, [key, value]) > {const imageName key.split(/).pop().replace(/\.…

PDF对话RAG应用开发实战

与大型 PDF 对话很酷。你可以与笔记、书籍和文档等聊天。这篇博文将帮助你构建一个基于 Multi RAG Streamlit 的 Web 应用程序&#xff0c;以通过对话式 AI 聊天机器人读取、处理和与 PDF 数据交互。以下是此应用程序工作原理的分步分解&#xff0c;使用简单的语言易于理解。 N…

运用电磁铁需求注意哪些问题

电磁铁是比较常用的磁场设备&#xff0c;在与磁性研究相关的实验室里&#xff0c;我们能经常看到&#xff0c;那磁场设备在使用的时候&#xff0c;包括各类电磁铁、亥姆霍兹线圈、螺线管等&#xff0c;有什么需要注意的事项呢&#xff1f; 电磁铁设备主要包括电磁铁以及配套电…

大跳水!华为三折叠手机黄牛价暴跌,市场需求显真相

华为首款三折叠手机Mate XT上市初期受到黄牛热炒&#xff0c;但由于实际需求不足和定价过高&#xff0c;市场溢价迅速下跌&#xff0c;反映出折叠屏手机市场仍需培养消费者接受度。 转载&#xff1a;科技新知 原创 作者丨依蔓 编辑丨蕨影 惊了&#xff01;华为首款三折叠手机M…

Electron 主进程与渲染进程、预加载preload.js

在 Electron 中&#xff0c;主要控制两类进程&#xff1a; 主进程 、 渲染进程 。 Electron 应⽤的结构如下图&#xff1a; 如果需要更深入的了解electron进程&#xff0c;可以访问官网 流程模型 文档。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用…

如何通过VSM识别生产过程中的信息流浪费?

VSM&#xff08;价值流图&#xff09;&#xff0c;作为精益生产的核心工具之一&#xff0c;它不仅仅是一张简单的流程图&#xff0c;更是企业优化生产流程、提升价值传递效率的指南针。通过VSM&#xff0c;我们可以清晰地看到从原材料到成品交付的全过程&#xff0c;包括物料流…

kafka集群跨双网段及多网段通信问题解决(避免踩坑)

一、问题场景&#xff1a; 实际生产环境总存在很多kafka集群跨网段的问题。kafka集群可能存在多个网卡&#xff0c;对应多个网段。不同网段之间需要同时与集群通信&#xff0c;即跨网段生产消费问题。 单机 # broker 的唯一标识符&#xff0c;在 Kafka 集群中必须唯一 broker.…

uniapp修改uni-ui组件样式(对微信小程序/H5有效,vue3)

寻找要修改的样式 使用开发者工具找到具体要修改的class类名 修改 <style lang"scss">//.nav为上一级的class.nav::v-deep .uni-navbar--border {border-bottom-style: none !important;} </style>完整代码 <template><view><uni-na…