PyQt5摄像头的使用--摄像头操作概述及使用摄像头拍照

这篇具有很好参考价值的文章主要介绍了PyQt5摄像头的使用--摄像头操作概述及使用摄像头拍照。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、功能概述
PyQt5多媒体模块为摄像头操作提供了几个类,可以用于获取摄像头设备信息,通过摄像头进行拍照和录像。

Qt多媒体模块的功能实现是依赖于平台的。在Windows平台上,Qt多媒体模块依赖于两个插件:一个是使用Microsoft DirectShow API的插件,DirectShow在Windows 98引入,在Windows XP以后就逐渐过时了;另一个是Windows Media Foundation(WMF)的插件,WMF插件在Windows Vista引入,用于替代DirectShow。

Qt中的WMF插件目前无法提供摄像头支持,对摄像头的有限支持是由DirectShow插件提供的,目前只能显示取景器和抓取静态图片,其他大部分功能不支持。所以,目前在Windows平台上,Qt的摄像头控制不支持视频录制功能,也不支持底层的视频功能,例如使用QVideoProbe探测视频帧。

PyQt5的多媒体模块在Windows平台上也无法实现摄像头录像功能。

2、主要类与函数
++++++++++++++++++++++++++++
QCameraInfo:摄像头设备信息类

availableCameras():返回QCameraInfo类型的列表,表示系统可用的摄像头。

defaultCamera():返回一个QCameraInfo对象,是系统默认的摄像头设备信息。

description():返回摄像头设备描述。

deviceName():返回摄像头设备名称。

position():返回值是枚举类型QCamera.Position,表示摄像头的位置。
例如手机一般有两个摄像头,前置摄像头位置类型为QCamera.FrontFace,后置摄像头位置类型为QCamera.BackFace,未指定位置的是QCamera.UnspecifiedPosition。
++++++++++++++++++++++++++++
QCamera:操作摄像头的类,创建QCamera对象时需传递一个QCameraInfo对象作为参数。

setViewfinder(viewfinder):为摄像头指定一个QVideoWidget或QGraphicsVideoItem对象viewfinder作为取景器,用于摄像头图像预览。一般使用一个QCameraViewfinder类对象用于摄像头预览,其父类是QVideoWidget。

setCaptureMode(mode):用于设置摄像头工作模式,参数mode是枚举类型QCamera. CaptureModes,有以下几种取值:
QCamera.CaptureViewfinder(取景器模式,摄像头仅用于预览);
QCamera.CaptureStillImage(抓取静态图片模式);
QCamera.CaptureVideo(视频录制模式)。

isCaptureModeSupported(mode),判断摄像头是否支持某种工作模式,参数mode是枚举类型QCamera.CaptureModes。

searchAndLock():拍照之前执行,用于在快门半按下时锁定摄像头的曝光、白平衡等参数

unlock():拍照后执行,用于解除锁定。
++++++++++++++++++++++++++++
QCameraImageCapture:控制摄像头进行静态图片的抓取

setEncodingSettings(settings):设置拍照图片的编码,settings是QImageEncoderSettings类型,设置内容包括编码方案、分辨率、图片质量等。

setBufferFormat(format):设置拍照缓冲区的图片的格式,参数format是枚举类型QVideoFrame.PixelFormat,有几十种取值,这里用QVideoFrame.Format_Jpeg,也就是使用JPEG格式。

setCaptureDestination(destination):用于设置所拍摄图片的保存方式,destination是枚举类型QCameraImageCapture.CaptureDestination,有以下两种取值:
QCameraImageCapture.CaptureToBuffer(拍摄的图片保存在缓冲区里,会发射信号
imageCaptured(),在此信号的槽函数里可以提取缓冲区中的图片); - QCameraImageCapture.CaptureToFile(拍摄的图片自动保存文件到用户目录的“图片”
文件夹里,保存图片后会发射imageSaved()信号)。 如果设置为CaptureToBuffer,就只会发射imageCaptured()信号,图片出现在缓冲区,不会自动保存为文件,也不会发射imageCaptured()信号;而如果设置为CaptureToFile,两个信号都会被发射。

QCameraImageCapture的3个信号及关联的槽函数的作用如下。

readyForCaptureChanged(ready):信号在摄像头是否可以拍照的状态变化时发射,bool型参数ready正好用于控制拍照按钮的使能状态。

imageCaptured(imageID, preview)在图像被抓取到缓冲区后发射,imageID是图像的编号,每次拍照时自动累加,preview是QImage类型,是拍摄的图片。在关联的槽函数里,将此图片的内容显示到界面上的QLabel组件LabImage上。

imageSaved(imageID, fileName)信号在图片保存为文件后发射,fileName是自动保存的文件名称。在关联的槽函数里显示了imageID和文件名fileName。
++++++++++++++++++++++++++++
QMediaRecorder:通过摄像头和音频输入设备进行视频录制

3、代码实现
PyQt5摄像头的使用--摄像头操作概述及使用摄像头拍照
这个窗口工作区的左侧是摄像头预览显示,是一个QCameraViewfinder组件,右侧是拍摄照片的显示,是一个QLabel组件。两个GroupBox组件之间使用了分割布局。文章来源地址https://www.toymoban.com/news/detail-453796.html

from PyQt5.QtGui import QImage,QPixmap
from PyQt5.QtMultimedia import (QCameraInfo,QCameraImageCapture,
      QImageEncoderSettings,QMultimedia,QVideoFrame,QSound,QCamera)
from ui_MainWindow import Ui_MainWindow

class QmyMainWindow(QMainWindow): 

   def __init__(self, parent = None):
      super().__init__(parent)    #调用父类构造函数,创建窗体
      self.ui = Ui_MainWindow()     #创建UI对象
      self.ui.setupUi(self)       #构造UI界面

      self.__LabCameraState = QLabel("摄像头state:")
      self.__LabCameraState.setMinimumWidth(150)
      self.ui.statusBar.addWidget(self.__LabCameraState)

      self.__LabImageID = QLabel("图片文件ID:") 
      self.__LabImageID.setMinimumWidth(100)
      self.ui.statusBar.addWidget(self.__LabImageID)

      self.__LabImageFile = QLabel("")   #保存的图片文件名
      self.ui.statusBar.addPermanentWidget(self.__LabImageFile)

      self.camera = None   #QCamera对象
      cameras = QCameraInfo.availableCameras()  #list[QCameraInfo]
      if len(cameras)>0:
         self.__iniCamera()       #初始化摄像头
         self.__iniImageCapture() #初始化静态画图
         self.camera.start()

##  ==============自定义功能函数========================
   def __iniCamera(self):   ##创建 QCamera对象
      camInfo=QCameraInfo.defaultCamera()    #获取缺省摄像头,QCameraInfo
      self.ui.comboCamera.addItem(camInfo.description())    #摄像头描述
      self.ui.comboCamera.setCurrentIndex(0)

      self.camera=QCamera(camInfo)  #创建摄像头对象
      self.camera.setViewfinder(self.ui.viewFinder)   #设置取景框预览
   ##          camera.setCaptureMode(QCamera.CaptureViewfinder) #预览
      self.camera.setCaptureMode(QCamera.CaptureStillImage)  #设置为抓图
   ##          camera.setCaptureMode(QCamera.CaptureVideo)

      mode=QCamera.CaptureStillImage
      supported=self.camera.isCaptureModeSupported(mode)
      self.ui.checkStillImage.setChecked(supported) #支持拍照

      supported=self.camera.isCaptureModeSupported(QCamera.CaptureVideo)
      self.ui.checkVideo.setChecked(supported)     #支持视频录制

      supported=self.camera.exposure().isAvailable()
      self.ui.checkExposure.setChecked(supported) #支持曝光补偿
      
      supported=self.camera.focus().isAvailable()
      self.ui.checkFocus.setChecked(supported)    #支持变焦
      
      self.camera.stateChanged.connect(self.do_cameraStateChanged)

   def __iniImageCapture(self):  ##创建 QCameraImageCapture对象
      self.capturer = QCameraImageCapture(self.camera)
      settings=QImageEncoderSettings()    #拍照设置
      settings.setCodec("image/jpeg")     #设置抓图图形编码
      settings.setResolution(640, 480)    #分辨率
      settings.setQuality(QMultimedia.HighQuality)    #图片质量
      self.capturer.setEncodingSettings(settings) 

      self.capturer.setBufferFormat(QVideoFrame.Format_Jpeg)   #缓冲区格式

      if self.ui.chkBoxSaveToFile.isChecked():
         dest=QCameraImageCapture.CaptureToFile    #保存到文件
      else:
         dest=QCameraImageCapture.CaptureToBuffer  #保存到缓冲区
      self.capturer.setCaptureDestination(dest)    #保存目标
      
      self.capturer.readyForCaptureChanged.connect(self.do_imageReady)
      
      self.capturer.imageCaptured.connect(self.do_imageCaptured)
      
      self.capturer.imageSaved.connect(self.do_imageSaved)
      
##  ==============event处理函数==========================
        
        
##  ==========由connectSlotsByName()自动连接的槽函数============        
   @pyqtSlot(bool)   ##设置保存方式
   def on_chkBoxSaveToFile_clicked(self,checked):
      if checked:
         dest=QCameraImageCapture.CaptureToFile    #保存到文件
      else:
         dest=QCameraImageCapture.CaptureToBuffer  #保存到缓冲区
      self.capturer.setCaptureDestination(dest)    #保存目标

   @pyqtSlot()   ##拍照
   def on_actCapture_triggered(self): 
      QSound.play("shutter.wav")    #播放快门音效
      self.camera.searchAndLock()   #快门半按下时锁定摄像头参数
      self.capturer.capture()       #拍照
      self.camera.unlock()          #快门按钮释放时解除锁定

   @pyqtSlot()   ##打开摄像头
   def on_actStartCamera_triggered(self):
      self.camera.start()

   @pyqtSlot()  ##关闭摄像头
   def on_actStopCamera_triggered(self):
      self.camera.stop()
      
   
        
   ##  =============自定义槽函数===============================        
   def do_cameraStateChanged(self,state):    ##摄像头状态变化
      if (state==QCamera.UnloadedState):
         self.__LabCameraState.setText("摄像头state: UnloadedState")
      elif (state==QCamera.LoadedState):
         self.__LabCameraState.setText("摄像头state: LoadedState")
      elif (state==QCamera.ActiveState):
         self.__LabCameraState.setText("摄像头state: ActiveState")
         
      self.ui.actStartCamera.setEnabled(state!=QCamera.ActiveState)
      self.ui.actStopCamera.setEnabled(state==QCamera.ActiveState)

   def do_imageReady(self,ready):   ##是否可以拍照了
      self.ui.actCapture.setEnabled(ready)

   def do_imageCaptured(self,imageID,preview): ##图片被抓取到内存
                                          #preview是 QImage
      H=self.ui.LabImage.height()
      W=self.ui.LabImage.width()
      
      scaledImage = preview.scaled(W,H,
                        Qt.KeepAspectRatio, Qt.SmoothTransformation)
      self.ui.LabImage.setPixmap(QPixmap.fromImage(scaledImage))
      self.__LabImageID.setText("图片文件ID:%d"%imageID)
      self.__LabImageFile.setText("图片保存为: ")

   def do_imageSaved(self,imageID,fileName):    ##图片被保存
      self.__LabImageID.setText("图片文件ID:%d"%imageID)
      self.__LabImageFile.setText("图片保存为: "+fileName)
      
   
##  ============窗体测试程序 ================================
if  __name__ == "__main__":        #用于当前窗体测试
   app = QApplication(sys.argv)    #创建GUI应用程序
   form=QmyMainWindow()            #创建窗体
   form.show()
   sys.exit(app.exec_())

到了这里,关于PyQt5摄像头的使用--摄像头操作概述及使用摄像头拍照的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pyqt5+Opencv实现摄像头图像的实时读取并显示

    QTimer在界面中不可见,在UI设计器中也找不到它,只能通过纯代码实现,主要作用是定时特定的时间。 想要掌握QTimer只需掌握setInterval(设置定时时间,单位ms)、start(启动定时器),和定时时间到时所发出的信号timeout()即可。程序设计的思路: 1.先设定定时周期 2.绑定timeout()信号

    2024年02月04日
    浏览(55)
  • 智能零售柜商品识别从零开始使用YOLOv5+PyQt5+OpenCV实现(支持图片、视频、摄像头实时检测)

    全流程 教程,从数据采集到模型使用到最终展示。若有任何疑问和建议欢迎评论区讨论。 先放上最终实现效果 检测效果 智能零售柜商品识别,当顾客将自己选购的商品放置在制定区域的时候,能精准地识别每一个商品,从而能够返回完整地购物清单及计算顾客应付的实际商

    2024年02月08日
    浏览(45)
  • STM32连接OV2640摄像头串口方式在PyQt5界面上展示视频界面 以及使用MQTT方式进行展示

    STM32连接OV2640 视频源接入到PyQt5界面中 作为AI模型的输入,视频流是非常重要的。在本文中,我们将介绍如何将STM32连接到OV2640摄像头,并将视频流接入到PyQt5界面中。 硬件连接 首先,我们需要将OV2640摄像头连接到STM32上。我们可以使用以下连接方式: OV2640 | STM32 ------|------

    2024年02月06日
    浏览(56)
  • PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

    目录 1--前言 2--基于Qt Designer设计ui文件 3--视频的编解码操作 4--完整代码 5--结果展示 6--存在的问题 7--参考 ① 创建两个线程, 主线程 为ui线程, 子线程 用于读取摄像头视频,将处理后的图像帧数据(处理操作可以人为添加)返回到主线程进行可视化; ② 子线程向主线程传

    2023年04月09日
    浏览(44)
  • 佩戴口罩检测从零开始使用YOLOv5+PyQt5+OpenCV+爬虫实现(支持图片、视频、摄像头实时检测,UI美化升级)

    全流程 教程,从数据采集到模型使用到最终展示。 支持图片检测、视频检测、摄像头实时检测,还支持视频的暂停、结束等功能。若有任何疑问和建议欢迎评论区讨论。 先放上最终UI实现效果 图片检测效果图 视频检测效果图 摄像头实时检测效果图 我已经处理了一份数据形

    2024年02月04日
    浏览(49)
  • 小白教程:PyQt5点击按钮,调用笔记本电脑摄像头将实时画面显示在label控件上,并且使用UI代码和逻辑代码分开的方式

    能力一般,水平有限,真心欢迎批评指正!以后会不断完善修改,如果对你有帮助欢迎点赞收藏! 小白教程,当我们掌握了一点点的Qt Designer的技能,得意于能够在界面上作画的时候,怎么编写其中的逻辑关系是我们进一步想要了解的,下面介绍了 点击按钮--调用笔记本电脑

    2024年01月17日
    浏览(92)
  • Python进阶,使用 opencv 调用摄像头进行拍照

             opencv 支持 Python 版本的模块叫作 opencv-p hon ,可直接使用 pip install opencv-python 令进行安装,但常常会因为网络等问题导致失败。推荐使用离线模式来安装 opencv 模块。 下载完安装包后,使用如下命令进行安装: D: pip install opencv

    2024年02月11日
    浏览(67)
  • 树莓派3B摄像头的详细使用教程(拍照+录像+监控)

    树莓派4B摄像头的详细使用教程(拍照+录像+监控) 本篇博文将介绍树莓派摄像头是如何在树莓派开发板上从安装到使用的,博主过程中参考了许多帖子,现将整理的比较全面的过程分享出来,供大家参考使用。 排线连接 硬件连接时我们首先需要使用树莓派摄像头FFC排线,连

    2024年02月03日
    浏览(50)
  • uni-app web端使用getUserMedia,摄像头拍照

    摄像头显示在video标签上 拍照 npm i html2canvas

    2024年04月16日
    浏览(38)
  • Android——调用摄像头拍照

    首先修改activity_main.xml 如下: 添加一个按钮和图片。 我们的逻辑功能是: 点击按钮后打开相机 相机拍照后图片返回到图片里 由于代码比较长切复杂,我会一步步讲解以便于我的理解。(没错就是我的) 首先我们需要为Button注册点击事件 我们要创建一个文件存放我们拍照的

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包