>  기사  >  백엔드 개발  >  Python+PyQt5를 사용하여 자체 제작 모니터링 가젯을 만드는 방법

Python+PyQt5를 사용하여 자체 제작 모니터링 가젯을 만드는 방법

WBOY
WBOY앞으로
2023-05-29 12:58:061528검색

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 함수를 호출하는 데 사용했습니다.

전체 프로그램 작업을 메인 루프에 추가하세요.

아아아아

위 내용은 Python+PyQt5를 사용하여 자체 제작 모니터링 가젯을 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제