一、前言

除了监控专用的摄像头以外,有一些应用场景用的还是USB摄像头,甚至还有一些单片机或者开发板上用的CMOS摄像头,而Qt在嵌入式领域应用相当广,所以用Qt来读取加载显示USB摄像头和CMOS摄像头,也是非常多Qter做过的事情,qt本身就封装了qcamera类,专用于本地摄像头的读取显示,这个类主要是在windows系统和安卓系统比较好使,在嵌入式上歇菜,而且安卓上widget的qcamera也不好使,要用qml的camera才好使,所以开发人员很多时候,就是在找坑填坑,找到一种最佳的适中方案,比如我自己做过的一个手机app,需要调用手机的摄像头,前置后置还要能切换,抓图做一些处理,用的就是qml嵌入到widget,通过信号槽来通信。

用Qt来加载USB摄像头解码,主要就三种方案,一种是Qt自带的,一种是ffmpeg来处理,一种是v4l2框架,每种方案都各自有优缺点和对应的应用场景,比如Qt自带的就非常适合windows下的只需要显示摄像头的场景,代码简单Qt内置使用方便,如果是需要拿到每张图片自己还要做分析处理比如人脸识别啥的,用ffmpeg是最好的,速度快资源占用低,可以自己GPU绘制,爽得很,如果是嵌入式linux的话,那用v4l2框架处理是最适合的,原生的通用api框架。

QCamera方案处理流程:

  1. 实例化QCamera对象,绑定stateChanged信号用于调整尺寸大小。
  2. 实例化QCameraViewfinder画布,将QCamera对象设置画布。默认采用类似句柄的形式显示画面,被系统接管绘制。
  3. 实例化QCameraImageCapture对象用来抓图,如果有需要的话。

二、功能特点

  1. 同时支持windows、linux、嵌入式linux上的USB摄像头实时采集。
  2. 支持多路USB摄像头多线程实时采集。
  3. 在嵌入式linux设备上,自动查找USB设备文件并加载。
  4. 可手动设置设备文件名称,手动设置后按照手动设置的设备文件加载。
  5. 在嵌入式linux设备上支持人脸识别接口,实时绘制人脸框。
  6. 具有打开、暂停、继续、关闭、截图等常规功能。
  7. 可设置两路OSD标签,分别设置文本、颜色、字号、位置等。
  8. 可作为视频监控系统使用。

三、效果图

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

//widget版本
static void getCameraInfo(QStringList &deviceNames, QStringList &descriptions)
{
#ifndef __arm__
#if (QT_VERSION > QT_VERSION_CHECK(5,5,0))
deviceNames.clear();
descriptions.clear();
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
if (cameras.count() == 0) {
qDebug() << TIMEMS << "not find USBCamera";
} else {
foreach (QCameraInfo camera, cameras) {
deviceNames << camera.deviceName();
descriptions << camera.description();
}
}
#endif
#endif
} void CameraThread::stateChanged()
{
#ifdef __arm__
#else
#if (QT_VERSION > QT_VERSION_CHECK(5,5,0))
if (camera->state() == QCamera::ActiveState) {
//输出当前设备支持的分辨率
QList<QSize> sizes = camera->supportedViewfinderResolutions();
emit resolutions(sizes);
//重新设置分辨率
QCameraViewfinderSettings set;
set.setResolution(cameraWidth, cameraHeight);
camera->setViewfinderSettings(set);
}
#endif
#endif
} bool CameraThread::init()
{
#ifdef __arm__
#else
#if (QT_VERSION > QT_VERSION_CHECK(5,5,0))
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
if (cameras.count() == 0) {
qDebug() << TIMEMS << "not find USBCamera";
return false;
} else {
QWidget *frm = (QWidget *)parent();
camera = new QCamera(frm);
connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(stateChanged())); viewfinder = new QCameraViewfinder(frm);
viewfinder->installEventFilter(this);
camera->setViewfinder(viewfinder); QRect rect = frm->rect();
viewfinder->setAspectRatioMode(fillImage ? Qt::IgnoreAspectRatio : Qt::KeepAspectRatio);
int offset = borderWidth * 1 + 0;
viewfinder->setGeometry(offset / 2, offset / 2, rect.width() - offset, rect.height() - offset);
viewfinder->setVisible(true); imageCapture = new QCameraImageCapture(camera);
connect(imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(displayImage(int, QImage)));
return true;
}
#endif
#endif
} //qml版本
import QtQuick 2.0
import QtMultimedia 5.6 Item {
signal receiveImage(); Video {
id: video
anchors.fill: parent
//source: "rtsp://192.168.1.247:554/av0_0"
source: "g:/mp4/1.mp4" MouseArea {
anchors.fill: parent
onClicked: {
video.play()
}
} focus: true
Keys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play()
Keys.onLeftPressed: video.seek(video.position - 5000)
Keys.onRightPressed: video.seek(video.position + 5000)
}
}

Qt音视频开发36-USB摄像头解码qcamera方案的更多相关文章

  1. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  2. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  3. Android开发 音视频开发需要了解的专业术语知识

    前言 在摸索一段时间的音视频开发后,越来越发现这个坑的深度真是特别的深. 除了了解Android自带的音视频处理API以外,还得了解一些视频与音频方面的知识.这篇博客就是主要讲解这方面的专业术语.内容 ...

  4. Android音视频开发(1):H264 基本原理

    前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...

  5. Android IOS WebRTC 音视频开发总结(六)-- iOS开发之含泪经验

    前段时间在搞webrtc iOS开发,所以将标题改为了Android IOS WebRTC 音视频开发总结, 下面都是开发过程中的经验总结,转载请说明出处(博客园RTC.Blacker): 1. IO ...

  6. Android WebRTC 音视频开发总结(四)-- webrtc传输模块

    在介绍WebRTC通讯之前我们先来看一个P2P视频聊天包括的主要过程,转载请说明出处(博客园RTC.Blacker): 音视频数据采集->编码->发送->接收->解码-> ...

  7. WebRTC 音视频开发

    WebRTC 音视频开发 webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)

    随笔分类 - webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...

  10. 音视频开发-FFmpeg

    音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...

随机推荐

  1. 如何在Windows 11系统中将任意文件(如bat/log等)固定在开始菜单?

    在Windows 11系统中,默认只支持将.exe/文件夹/.zip固定在开始菜单,如果想将其他文件如.bat/.log等文件固定在开始菜单将在右键菜单中找不到选项. 一个更简单的办法: 对任意文件右 ...

  2. manim边学边做--极坐标平面

    PolarPlane,顾名思义,是用于创建极坐标平面的类. 与笛卡尔坐标系不同,极坐标系是基于角度和半径来定位点的,这里的每个点由一个角度和距离原点的距离表示. 在Manim中,PolarPlane通 ...

  3. springBoot项目启动卡在Root WebApplicationContext: initialization completed... (非DEBUG断点问题)

    通过源码启动排查发现,初始化连接池时创建了200次,通过配置文件中将initialSize值改为10,启动时间从1分钟变为了3秒.

  4. 改变mysql默认字符集为utf8

    问题:在使用mysql时,使用php插入数据库.查询数据库信息会出现乱码 解决:修改mysql配置文件,在其配置文件中加入一下代码 init_connect='SET collation_connec ...

  5. 题解:CF1537E2 Erase and Extend (Hard Version)

    CF1537E2 Erase and Extend 题解 分析 通过观察题目,可以证明结果一定是由多次前缀复制得来的. 题目要求你进行删和复制的操作,与其交替着操作,不如直接先删到最优的前缀再进行复制 ...

  6. ExtJS & Asp.NET

    企业应用中,要快速开发Web应用,前端使用ExtJS还行,包含许多常用的控件,图标,配色方案... 帖上部分载图: 完全可订制的登录界面: 可调整的布局: 可综合使用的模态对话框: 树结构及动态加载: ...

  7. 一文带你搞懂GaussDB数据库性能调优

    本文分享自华为云社区<[GaussTech技术专栏]GaussDB性能调优>,作者:GaussDB 数据库. 数据库性能调优是一项复杂且系统性的工作,需要综合考虑多方面的因素.因此,调优人 ...

  8. YIi2 Object 报错问题

    yii2的老版本会有在PHP7运行的错误提示 Cannot use yii\base\Object as Object because 'Object' is a special class name ...

  9. 腾讯AICR : 智能化代码评审技术探索与应用实践(上)

  10. 【昌哥IT课堂】MySQL8.3 EXPLAIN中的新JSON格式(译)

    MySQL提供了两个用于分析查询计划的强大工具:EXPLAIN和EXPLAIN ANALYZE.EXPLAIN显示优化器选择的执行计划,并在执行之前停止,而EXPLAIN ANALYZE实际执行查询并 ...