Pyqt5打開電腦攝像頭進(jìn)行拍照的實(shí)現(xiàn)示例
1、設(shè)計(jì)UI界面

將ui界面轉(zhuǎn)為py文件后獲得的邏輯代碼為:(文件名為 Camera.py)
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ca.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_mainWindow(object):
def setupUi(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.resize(648, 280)
self.centralwidget = QtWidgets.QWidget(mainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(10, 20, 631, 181))
self.widget.setObjectName("widget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setPointSize(20)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.label_2 = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setPointSize(20)
self.label_2.setFont(font)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.horizontalLayout.addWidget(self.label_2)
self.widget1 = QtWidgets.QWidget(self.centralwidget)
self.widget1.setGeometry(QtCore.QRect(10, 210, 631, 51))
self.widget1.setObjectName("widget1")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.pushButton = QtWidgets.QPushButton(self.widget1)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout_2.addWidget(self.pushButton)
self.pushButton_2 = QtWidgets.QPushButton(self.widget1)
self.pushButton_2.setObjectName("pushButton_2")
self.horizontalLayout_2.addWidget(self.pushButton_2)
self.pushButton_3 = QtWidgets.QPushButton(self.widget1)
self.pushButton_3.setObjectName("pushButton_3")
self.horizontalLayout_2.addWidget(self.pushButton_3)
self.pushButton_4 = QtWidgets.QPushButton(self.widget1)
self.pushButton_4.setObjectName("pushButton_4")
self.horizontalLayout_2.addWidget(self.pushButton_4)
mainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "MainWindow"))
self.label.setText(_translate("mainWindow", "攝像頭"))
self.label_2.setText(_translate("mainWindow", "采集圖像"))
self.pushButton.setText(_translate("mainWindow", "打開攝像頭"))
self.pushButton_2.setText(_translate("mainWindow", "采集圖像"))
self.pushButton_3.setText(_translate("mainWindow", "關(guān)閉攝像頭"))
self.pushButton_4.setText(_translate("mainWindow", "打開圖像"))2、設(shè)計(jì)邏輯代碼,建立連接顯示窗口
邏輯代碼如下:(文件名為Camera_main.py)
# here put the import lib
import sys
from PyQt5 import QtGui, QtWidgets
from Camera import Ui_mainWindow
import cv2
import time
from PyQt5.Qt import *
class Open_Camera(QtWidgets.QMainWindow, Ui_mainWindow):
def __init__(self):
super(Open_Camera, self).__init__()
self.setupUi(self) # 創(chuàng)建窗體對象
self.init()
self.cap = cv2.VideoCapture() # 初始化攝像頭
self.photo_flag = 0
self.label.setScaledContents(True) # 圖片自適應(yīng)
self.label_2.setScaledContents(True) # 圖片自適應(yīng)
def init(self):
# 定時(shí)器讓其定時(shí)讀取顯示圖片
self.camera_timer = QTimer()
self.camera_timer.timeout.connect(self.show_image)
# 打開攝像頭
self.pushButton.clicked.connect(self.open_camera)
# 拍照
self.pushButton_2.clicked.connect(self.taking_pictures)
# 關(guān)閉攝像頭
self.pushButton_3.clicked.connect(self.close_camera)
# 導(dǎo)入圖片
self.pushButton_4.clicked.connect(self.loadphoto)
# 開啟攝像頭
def open_camera(self):
self.cap = cv2.VideoCapture(0) # 攝像頭
self.camera_timer.start(40) # 每40毫秒讀取一次,即刷新率為25幀
self.show_image()
# 顯示圖片
def show_image(self):
flag, self.image = self.cap.read() # 從視頻流中讀取圖片
width,height,_ = self.image.shape # 行:寬,列:高
ratio1 = width / self.label.width() # (label 寬度)
ratio2 = height / self.label.height() # (label 高度)
ratio = max(ratio1, ratio2)
image_show = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB) # opencv讀的通道是BGR,要轉(zhuǎn)成RGB
image_show = cv2.flip(image_show, 1) # 水平翻轉(zhuǎn),因?yàn)閿z像頭拍的是鏡像的。
# 把讀取到的視頻數(shù)據(jù)變成QImage形式(圖片數(shù)據(jù)、高、寬、RGB顏色空間,三個(gè)通道各有2**8=256種顏色)
self.showImage = QtGui.QImage(image_show.data, height, width, QImage.Format_RGB888)
self.showImage.setDevicePixelRatio(ratio) # 按照縮放比例自適應(yīng) label 顯示
self.label.setPixmap(QPixmap.fromImage(self.showImage)) # 往顯示視頻的Label里顯示QImage
# self.label.setScaledContents(True) # 圖片自適應(yīng)
# 拍照
def taking_pictures(self):
if self.cap.isOpened():
FName = fr"images/cap{time.strftime('%Y%m%d%H%M%S', time.localtime())}"
print(FName)
self.label_2.setPixmap(QtGui.QPixmap.fromImage(self.showImage))
# self.showImage.save(FName + ".jpg", "JPG", 100)
self.showImage.save('./1.jpg')
else:
QMessageBox.critical(self, '錯(cuò)誤', '攝像頭未打開!')
return None
# 關(guān)閉攝像頭
def close_camera(self):
self.camera_timer.stop() # 停止讀取
self.cap.release() # 釋放攝像頭
self.label.clear() # 清除label組件上的圖片
self.label_2.clear() # 清除label組件上的圖片
self.label.setText("攝像頭")
# self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 攝像頭
# 導(dǎo)入圖片
def loadphoto(self):
fname, _ = QFileDialog.getOpenFileName(self, '選擇圖片', '../', 'Image files(*.jpg *.gif *.png*.bmp)')
self.showImage = fname
self.label_2.setPixmap(QPixmap(self.showImage).scaled(self.label_2.width(), self.label_2.height()))
if __name__ == '__main__':
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) # 自適應(yīng)分辨率
app = QtWidgets.QApplication(sys.argv)
ui = Open_Camera()
ui.show()
sys.exit(app.exec_())3、結(jié)果

參考:暫未成功人士
到此這篇關(guān)于Pyqt5打開電腦攝像頭進(jìn)行拍照的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Pyqt5攝像頭拍照內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python在類中強(qiáng)制規(guī)定編碼的高級開發(fā)指南
在Python開發(fā)中,??編碼約定??是保證代碼質(zhì)量和可維護(hù)性的關(guān)鍵因素,類作為面向?qū)ο缶幊痰暮诵臉?gòu)造,其設(shè)計(jì)質(zhì)量直接影響整個(gè)系統(tǒng)的架構(gòu)健康度,下面我們就來看看Python在類中強(qiáng)制規(guī)定編碼約定的各種技術(shù)吧2025-11-11
PyCharm進(jìn)行Django項(xiàng)目開發(fā)環(huán)境搭建
本文主要介紹了PyCharm進(jìn)行Django項(xiàng)目開發(fā)環(huán)境搭建,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
python數(shù)字轉(zhuǎn)對應(yīng)中文的方法總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于python數(shù)字轉(zhuǎn)對應(yīng)中文的方法總結(jié)內(nèi)容,有興趣的朋友們可以跟著猜嘗試測試下。2021-08-08
Pandas之Fillna填充缺失數(shù)據(jù)的方法
這篇文章主要介紹了Pandas之Fillna填充缺失數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python動(dòng)態(tài)導(dǎo)入模塊和反射機(jī)制詳解
這篇文章主要介紹了Python動(dòng)態(tài)導(dǎo)入模塊和反射機(jī)制詳解,需要的朋友可以參考下2020-02-02
從基礎(chǔ)到高級詳解DataFrame中時(shí)間序列操作的核心方法
時(shí)間序列數(shù)據(jù)是數(shù)據(jù)分析中最常見的類型之一,本文將系統(tǒng)介紹DataFrame中時(shí)間序列操作的核心方法,希望可以幫助大家掌握時(shí)間數(shù)據(jù)處理的全流程2026-02-02
新版pycharm配置運(yùn)行參數(shù)的教程/pycharm2023
這篇文章主要介紹了新版pycharm配置運(yùn)行參數(shù)的教程/pycharm2023,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

