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. Nature综述:噬菌体的百年研究
  2. 戴尔t410支持哪些服务器系统,DELL服务器T410
  3. 【Trie】bzoj1212 [HNOI2004]L语言
  4. 数据库原理及应用【六】数据库设计
  5. c语言作业系统输出超限,C语言网Online Judge系统支持语言和编译说明
  6. linux系统grep用法,Linux系统中怎么使用grep命令?
  7. apache php mysql环境搭建_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
  8. java正则表达式获得html字符串中图片的url地址
  9. 2019.03.25 bzoj4572: [Scoi2016]围棋(轮廓线dp)
  10. 解决办法:GLib-ERROR **: Creating pipes for GWakeup: Too many open files
  11. 向量叉乘的几何意义及其模的计算
  12. DID 去中心化数字身份
  13. OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合
  14. 2021年过了大半了,脑机接口取得哪些进展?
  15. 精彩回顾|展会圆满收官,落幕不散场,期待与您的再次相遇,下一站上海!
  16. 7-2 统计英文字母和数字字符[2]
  17. C语言求任意数的阶层
  18. 【单片机】汇编指令入门学习|单片机启动代码汇编
  19. WebRTC基础实践 - 10. 总结
  20. 【速览】2021年全球及中国培育钻石行业发展现状及未来发展趋势分析[图]

热门文章

  1. java计算机毕业设计服装定制管理系统源码+mysql数据库+系统+lw文档+部署
  2. 医院计算机操作权限管理制度,医院信息安全管理制度_医院信息安全管理制度办法...
  3. 宽带离网用户分析(5) Lasso和Group Lasso
  4. Vue+Element-UI 使用 Vform 表单设计器
  5. RescoPhotoViewer图片查看v5.0_s60v3破解汉化版by八神
  6. Instrusive 【HDU - 5040】【2014 北京 BFS】
  7. 什么是机器人的五点校正法_机器人20点法校准和6点法区别
  8. 老电工教你快速学会如何看懂电气控制电路图
  9. Primavera Unifier 自定义报表制作及打印分享
  10. 很有用的PHP笔试题系列二