QCamera相机类提供了一些基本的功能,包括拍照和录制功能(Windows不支持录制视频),但也有很多接口是没有封装的,比如有些UVC摄像头有物理按键,可以进行拍图等操作,但是QCamera没法响应硬件按钮的拍图操作。

网络上的相关代码都是直接封装平台库(如Windows的DirectShow,Linux的V4L2)来支持硬件按钮,比如我之前参考的一些:

https://www.jianshu.com/p/a67b8cfc57c5

https://gitee.com/fsfzp888/UVCCapture/

https://github.com/GoodRon/QtWebcam

https://github.com/liuleidong/UVCCaptureDemo

但是自己封装出来的效果不是太好,总有一些奇怪的BUG。后来查看Qt5文档和源码,QCamera在Windows平台也是封装的DirectShow,代码路径:

Qt\qt-everywhere-src-5.15.2\qtmultimedia\src\plugins\directshow

既然如此,想让QCamera响应硬件按钮的拍图操作,只需要修改下directshow这个插件即可,而其他的视频渲染等功能就不用自己封装了。视频预览和拍图的接口是差不多的,只需要把预览的接口复制粘贴一份稍加修改。(如果要扩展其他功能,也是直接修改相关源码即可)

先在directshowcameraglobal.h加一个GUID声明PIN_CATEGORY_STILL(因为文本不好标注哪些是新增的,所以用的截图,图中红色为新增代码):

在dscamerasession.h和cpp代码里搜m_previewSampleGrabber和m_nullRendererFilter,然后复制粘贴修改一份。有一点不同的就是,预览的接口如果操作失败是直接返回false,但是硬件拍图我们不能直接返回,因为有的相机本身就没对应的接口,直接跳过就好了。

dscamerasession.h:

dscamerasession.cpp:

DirectShowSampleGrabber::bufferAvailable信号表示有数据来了,连接该信号进行处理,然后使用imageCaptured将图片信号发送出去即可。我这里偷懒发的空图,然后在主程序里判断是否为空再主动触发一次拍图。

    if (!m_stillSampleGrabber) {m_stillSampleGrabber = new DirectShowSampleGrabber(this);connect(m_stillSampleGrabber, &DirectShowSampleGrabber::bufferAvailable,this, [this](){qDebug()<<"Still capture bufferAvailable";emit imageCaptured(-1, QImage());});}
void UVCCamera::onImageCaptured(int id, const QImage &preview)
{//判断是否是我们在plugins里触发的if (preview.isNull()) {if (id == -1)capture(); //主动拍图return;}//... ...
}

Windows下让Qt5 QCamera响应UVC摄像头硬件按钮拍图相关推荐

  1. Windows下 QT 使用directdshow对UVC摄像头控制

    QT使用QCamera配合QCameraViewfinder就可以显示UVC摄像头图像 (详细看QT示例,搜索camera) 如果需要UVC原始数据就使用QVideoProbe 但是QT没有做对UVC ...

  2. windows下opencv同时开启两个摄像头采集程序

    亲测可用的代码,至于为什么把 VideoCapture cap(1);//写成全局变量,方便写其他C程序 VideoCapture capcap(2); Mat frame; Mat frame2; ...

  3. Windows下的QT系统开发环境搭建

            QT是一款由Qt Company开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特殊 ...

  4. 简明Hadoop配置(3)——windows下eclipse连接虚拟机

    在windows下配置,还需要当心IP地址和eclipse配置时的问题,这需要单独说一下. 在Ubuntu下eclipse新建hadoopIP直接填localhost就好,但是在windows下肯定是 ...

  5. Windows下虚拟UVC摄像头开发演示

    最近在windows10 x64下开发了一个USB虚拟总线驱动,该驱动可接收上位机的指令动态创建或卸载UVC摄像头. UVC摄像头的数据通过上位机下发给驱动,驱动再给视频播放软件,这样就可以实现视频的 ...

  6. windows下给定多个openNi的Uri,匹配与uri对应的Uvc RGB设备

    1.问题描述: 在瀚维医疗项目中,客户给定两台deeyea(OpenNi+Uvc)设备,在windows平台下分别固定在不同的usb端口上,同时给定了两个设备的uri,默认给定的第一个设备的uri为左 ...

  7. 乐视三合一体感摄像头--基本信息及windows下部分开发

    乐视三合一体感摄像头--基本信息及windows下部分开发 Introduction 基本信息 Windows下使用 安装驱动 使用openNI 使用imageJ 调用RGB图像 Q: 参考资料 In ...

  8. windows访问uvc摄像头扩展单元api库分享

    分享一个自己封装的windows通过dshow接口访问uvc扩展单元的dll库,采用vs2017编译,分别编译了x86,x64的debug和release版本,可直接调用,api调用方法如下: (1) ...

  9. linux系统USB摄像头反应慢,Linux下OpenCV打开USB接口的UVC摄像头及索引号是202的原因...

    一般来说,USB的UVC摄像头在Linux平台下通过V4L驱动来使用.OpenCV打开USB的UVC摄像头一般也通过V4L驱动来打开.打开方法网上都有,一般就是通过VideoCapture的open( ...

最新文章

  1. java执行linux shell命令,并拿到返回值
  2. NYOJ 116 士兵杀敌(二)
  3. linux日志分析与痕迹清理
  4. Linux MISC 驱动实验
  5. python 通过ip获取城市_python 根据ip获取地理位置
  6. 每天都用微信聊天,但你可能不知道它还隐藏着这些超实用的功能
  7. c语言中同级运算符的运算顺序,二 如何学习C语言的运算符和运算顺序
  8. mysql5.6源码自动安装脚本
  9. G1垃圾回收器总结一
  10. rgb矩阵Android程序,Android ColorMatrixColorFilter
  11. Spring解析@ComponentScan注解的执行流程
  12. 十天学会单片机(2)点亮一个发光管
  13. 高通QMI_WWAN驱动详解
  14. 在文档阅读器上为 PDF 文档生成多级目录
  15. eclipse中添加subclipse插件
  16. stm32 HC05驱动
  17. 像素、分辨率、尺寸概念与关系
  18. 关于浮点型误差的解决方法
  19. 红楼梦词频统计,词云生成
  20. Mac 和 iPad 产品线要合并?苹果高管回应了

热门文章

  1. 使用matlab设计电机控制器,matlab实验五直流电机拖动系统控制器设计.doc
  2. 来了!娱乐篇!一文带你了解那些适合日常使用的开源工具和应用(娱乐篇)
  3. android支付宝客户端html5网页偶尔无法自动关闭问题
  4. 迅雷一直提示“正在开始”“正在停止”的解决方案
  5. fireworks快捷键
  6. Express框架介绍_李孟_新浪博客
  7. 事和书的感悟_李孟_新浪博客
  8. 拆分体提示工具未形成相交_下面哪一项不是一般模型拆分原则( ) (1.0分)_学小易找答案...
  9. Linux操作系统下,在终端打印出闪烁的星星图案
  10. 精益生产管理的优势特点以及工具步骤