摄像头的使用

链接:https://pan.baidu.com/s/10xbmboUO0b2nKjeo9fep0A 
提取码:frcj

myMainWindow.py

import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QLabel
from PyQt5.QtCore import pyqtSlot,Qt
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()
        self.ui.setupUi(self)

        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)#设置预览组件
        self.camera.setCaptureMode(QCamera.CaptureStillImage)#拍照模式

        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 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 __iniImageCapture(self):#创建QCameraImageCapture对象
        self.capturer=QCameraImageCapture(self.camera)
        settings=QImageEncoderSettings()#拍照设置
        settings.setCodec("image/jpeg")#设置图形编码
        settings.setResolution(640,480)#分辨率
        settings.setQuality(QMultimedia.HighQuality)#图片质量
        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)
    
    @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_imageReady(self,ready):#是否可以拍照了
        self.ui.actCapture.setEnabled(ready)
    def do_imageCaptured(self,imageID,preview):#图片被抓取到内存
        H=self.ui.LabImage.height()
        W=self.ui.LabImage.width()
        #preview是QImage对象
        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__":
    # QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#自适应缩放
    app=QApplication(sys.argv)
    form=QmyMainWindow()
    form.show()
    sys.exit(app.exec_())

 

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/108695660