Pyqt5打開電腦攝像頭進行拍照的實現(xiàn)示例
1、設計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、設計邏輯代碼,建立連接顯示窗口
邏輯代碼如下:(文件名為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) # 圖片自適應 self.label_2.setScaledContents(True) # 圖片自適應 def init(self): # 定時器讓其定時讀取顯示圖片 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) # 導入圖片 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),因為攝像頭拍的是鏡像的。 # 把讀取到的視頻數(shù)據(jù)變成QImage形式(圖片數(shù)據(jù)、高、寬、RGB顏色空間,三個通道各有2**8=256種顏色) self.showImage = QtGui.QImage(image_show.data, height, width, QImage.Format_RGB888) self.showImage.setDevicePixelRatio(ratio) # 按照縮放比例自適應 label 顯示 self.label.setPixmap(QPixmap.fromImage(self.showImage)) # 往顯示視頻的Label里顯示QImage # self.label.setScaledContents(True) # 圖片自適應 # 拍照 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, '錯誤', '攝像頭未打開!') 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) # 攝像頭 # 導入圖片 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) # 自適應分辨率 app = QtWidgets.QApplication(sys.argv) ui = Open_Camera() ui.show() sys.exit(app.exec_())
3、結(jié)果
參考:暫未成功人士
到此這篇關(guān)于Pyqt5打開電腦攝像頭進行拍照的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Pyqt5攝像頭拍照內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Playwright元素截圖并保存至allure的實現(xiàn)示例
在UI自動化測試中,我們經(jīng)常需要獲取屏幕截圖,本文就介紹一下Playwright元素截圖并保存至allure的實現(xiàn)示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Python報錯ImportError:?IProgress?not?found.?Please?update
在使用Jupyter Notebook或JupyterLab進行交互式編程時,我們可能會遇到各種導入錯誤,本文就來介紹一下Python報錯ImportError:?IProgress?not?found.?Please?update?jupyter?and?ipywidgets解決,感興趣的可以了解一下2024-06-06詳解Pandas中stack()和unstack()的使用技巧
當你在處理包含某種序列(例如時間序列數(shù)據(jù))的變量的數(shù)據(jù)集時,數(shù)據(jù)通常需要進行重塑。Pandas?提供了各種用于重塑?DataFrame?的內(nèi)置方法。其中,stack()?和?unstack()?是最流行的,本文總結(jié)了這兩個方法的7種使用技巧,需要的可以參考一下2022-03-03python使用selenium打開chrome瀏覽器時帶用戶登錄信息實現(xiàn)過程詳解
這篇文章主要介紹了python使用selenium打開chrome瀏覽器時帶用戶登錄信息,本文以實例給大家來展示如何讓selenium在打開chrome瀏覽器的時候帶上用戶的登錄信息,感興趣的朋友跟隨小編一起看看吧2022-02-02Django之Mode的外鍵自關(guān)聯(lián)和引用未定義的Model方法
今天小編就為大家分享一篇Django之Mode的外鍵自關(guān)聯(lián)和引用未定義的Model方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python實現(xiàn)批量將符合要求的文件自動復制到新文件夾
這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)批量將文件名稱符合要求的文件自動復制到新文件夾,文中的示例代碼講解詳細,有需要的小伙伴可以參考下2023-10-10