溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用Python+PyQt5自制監(jiān)控小工具

發(fā)布時(shí)間:2023-03-17 10:23:59 來(lái)源:億速云 閱讀:112 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(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)控的歷史視頻記錄。

怎么使用Python+PyQt5自制監(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()

怎么使用Python+PyQt5自制監(jiān)控小工具

開(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í)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI