您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么使用Python+PyQt5自制監(jiān)控小工具”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
利用opencv的圖像處理功能可以輕松對(duì)計(jì)算機(jī)攝像頭的調(diào)用實(shí)現(xiàn)實(shí)時(shí)圖像的采集效果。
最終將圖片進(jìn)行保存后生成監(jiān)控的歷史視頻記錄。
pip install PyQt5 pip install python-opencv
若是沒(méi)有安裝相關(guān)的模塊,可以選擇上述pip的方式進(jìn)行安裝。
接下來(lái)我們將需要的python模塊導(dǎo)入到代碼塊中。
# It's just an alias for the cv2 module. import cv2 as cv_ # It's importing all the classes from the QtGui module. from PyQt5.QtGui import * # It's importing all the classes from the QtCore module. from PyQt5.QtCore import * # It's importing all the classes from the QtWidgets module. from PyQt5.QtWidgets import * # It's importing the sys module. import sys # It's importing the os module. import os # It's importing the time module. import time # It's importing the traceback module. import traceback
創(chuàng)建名稱為CameraUI的python類,開(kāi)發(fā)監(jiān)控工具相關(guān)的頁(yè)面組件及布局。
將控件按鈕等對(duì)應(yīng)的槽函數(shù)也放到該類中。
class CameraUI(QWidget): def __init__(self): super(CameraUI, self).__init__() self.init_ui() def init_ui(self): self.setWindowTitle('本地監(jiān)控工具 公眾號(hào):Python 集中營(yíng)') self.setWindowIcon(QIcon('ico.png')) self.resize(600, 400) self.label_view = QLabel() self.image_path = QLineEdit() self.image_path.setReadOnly(True) self.image_path.setPlaceholderText('視頻流圖片保存地址') self.image_path_btn = QPushButton() self.image_path_btn.setText('打開(kāi)') self.image_path_btn.clicked.connect(self.image_path_btn_clk) self.video_path = QLineEdit() self.video_path.setReadOnly(True) self.video_path.setPlaceholderText('監(jiān)控視頻保存地址') self.video_path_btn = QPushButton() self.video_path_btn.setText('打開(kāi)') self.video_path_btn.clicked.connect(self.video_path_btn_clk) self.start_listen_btn = QPushButton() self.start_listen_btn.setText('開(kāi)啟監(jiān)控') self.start_listen_btn.clicked.connect(self.start_listen_btn_clk) self.brower = QTextBrowser() self.brower.setReadOnly(True) self.brower.setFont(QFont('宋體', 8)) self.brower.setPlaceholderText('日志處理過(guò)程區(qū)域...') self.brower.ensureCursorVisible() hbox = QHBoxLayout() vbox_left = QVBoxLayout() vbox_right = QVBoxLayout() vbox_left.addWidget(self.label_view) vbox_right_grid1 = QGridLayout() vbox_right_grid1.addWidget(self.image_path, 0, 0, 1, 2) vbox_right_grid1.addWidget(self.image_path_btn, 0, 2, 1, 1) vbox_right_grid1.addWidget(self.video_path, 1, 0, 1, 2) vbox_right_grid1.addWidget(self.video_path_btn, 1, 2, 1, 1) vbox_right_grid2 = QGridLayout() vbox_right_grid2.addWidget(self.brower, 0, 0, 1, 3) vbox_right_grid2.addWidget(self.start_listen_btn, 1, 0, 1, 3) vbox_right.addLayout(vbox_right_grid1) vbox_right.addLayout(vbox_right_grid2) hbox.addLayout(vbox_left) hbox.addLayout(vbox_right) self.listen_thread = ListenWorkThread(self) self.listen_thread.message.connect(self.show_message) self.listen_thread.finished.connect(lambda: self.start_listen_btn.setEnabled(True)) self.setLayout(hbox) def show_message(self, text): cursor = self.brower.textCursor() cursor.movePosition(QTextCursor.End) self.brower.append(text) self.brower.setTextCursor(cursor) self.brower.ensureCursorVisible() def image_path_btn_clk(self): dir = QFileDialog.getExistingDirectory(self, "選擇文件夾", os.getcwd()) self.image_path.setText(dir) def video_path_btn_clk(self): dir = QFileDialog.getExistingDirectory(self, "選擇文件夾", os.getcwd()) self.video_path.setText(dir) def start_listen_btn_clk(self): self.listen_thread.start()
開(kāi)發(fā)一個(gè)ListenWorkThread類并且繼承自QThread的子線程。
將該線程作為業(yè)務(wù)類實(shí)現(xiàn)調(diào)用本地?cái)z像頭完成監(jiān)控的效果。
class ListenWorkThread(QThread): message = pyqtSignal(str) finished = pyqtSignal(bool) def __init__(self, parent=None): super(ListenWorkThread, self).__init__(parent) self.parent = parent self.working = True def __del__(self): self.working = False def run(self): try: image_path = self.parent.image_path.text() video_path = self.parent.video_path.text() if image_path.strip() == '' or video_path.strip() == '': self.message.emit('相關(guān)路徑設(shè)置不能為空,請(qǐng)檢查設(shè)置!') return self.cap = cv_.VideoCapture(0) self.cap.set(3, 300) self.cap.set(4, 400) if self.cap.isOpened(): self.message.emit('攝像頭已成功打開(kāi)!') n = 0 self.message.emit('正在進(jìn)行視頻 監(jiān)控中....') start_time = time.clock() while True: ret, img = self.cap.read() if os.path.exists(os.path.join(image_path, str(n) + '.jpg')): os.remove(os.path.join(image_path, str(n) + '.jpg')) self.save_image(img, str(n), image_path) time.sleep(0.1) pixmap_ = QPixmap(os.path.join(image_path, str(n) + '.jpg')) self.parent.label_view.setPixmap(pixmap_) n = n + 1 self.finished.emit(True) except Exception as e: traceback.print_exc() self.message.emit('程序運(yùn)行錯(cuò)誤,請(qǐng)檢查參數(shù)是否設(shè)置正確!') self.finished.emit(True) def save_image(self, image=None, file_name=None, image_path=None): if image is not None: cv_.imwrite(os.path.join(image_path, file_name + '.jpg'), image)
以上整個(gè)業(yè)務(wù)子線程的邏輯就開(kāi)發(fā)完成了,然后使用python模塊的main函數(shù)調(diào)用。
將整個(gè)程序的運(yùn)行加入到主體循環(huán)當(dāng)中。
if __name__ == '__main__': app = QApplication(sys.argv) main = CameraUI() main.show() sys.exit(app.exec_())
“怎么使用Python+PyQt5自制監(jiān)控小工具”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。