链接: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_())