ホームページ  >  記事  >  バックエンド開発  >  Python+PyQt5を使って自作監視ガジェットを作成する方法

Python+PyQt5を使って自作監視ガジェットを作成する方法

WBOY
WBOY転載
2023-05-29 12:58:061565ブラウズ

opencv の画像処理機能を使用すると、コンピュータのカメラを簡単に呼び出して、リアルタイムの画像収集効果を実現できます。

最後に画像を保存し、監視の履歴ビデオ記録を生成します。

Python+PyQt5を使って自作監視ガジェットを作成する方法

pip install PyQt5

pip install python-opencv

関連モジュールがインストールされていない場合は、上記の pip メソッドを選択してインストールできます。

次に、必要な Python モジュールをコード ブロックにインポートします。

# 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

CameraUI という名前の Python クラスを作成し、監視ツールに関連するページ コンポーネントとレイアウトを開発します。

コントロールボタンなどの対応するスロット機能をこのクラスに入れます。

class CameraUI(QWidget):
    def __init__(self):
        super(CameraUI, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('本地监控工具 公众号:Python 集中营')
        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('打开')
        self.image_path_btn.clicked.connect(self.image_path_btn_clk)

        self.video_path = QLineEdit()
        self.video_path.setReadOnly(True)
        self.video_path.setPlaceholderText('监控视频保存地址')

        self.video_path_btn = QPushButton()
        self.video_path_btn.setText('打开')
        self.video_path_btn.clicked.connect(self.video_path_btn_clk)

        self.start_listen_btn = QPushButton()
        self.start_listen_btn.setText('开启监控')
        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('日志处理过程区域...')
        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を使って自作監視ガジェットを作成する方法

ListenWorkThread クラスを開発し、QThread の子スレッドを継承します。

このスレッドをビジネス クラスとして使用して、ローカル カメラを呼び出して監視を完了する効果を実現します。

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('相关路径设置不能为空,请检查设置!')
                return
            self.cap = cv_.VideoCapture(0)
            self.cap.set(3, 300)
            self.cap.set(4, 400)
            if self.cap.isOpened():
                self.message.emit('摄像头已成功打开!')
                n = 0
                self.message.emit('正在进行视频 监控中....')
                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('程序运行错误,请检查参数是否设置正确!')
            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)

ビジネス サブスレッド全体の上記のロジックが開発され、Python モジュールの main 関数を使用して呼び出します。

プログラム全体の実行をメイン ループに追加します。

rree

以上がPython+PyQt5を使って自作監視ガジェットを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。