怎么使用Python+PyQt5自制监控小工具
利用opencv的图像处理功能可以轻松对计算机摄像头的调用实现实时图像的采集效果。
最终将图片进行保存后生成监控的历史视频记录。
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()
开发一个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函数调用。
将整个程序的运行加入到主体循环当中。
if __name__ == '__main__': app = QApplication(sys.argv) main = CameraUI() main.show() sys.exit(app.exec_())
以上是怎么使用Python+PyQt5自制监控小工具的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

VS Code可以在Windows 8上运行,但体验可能不佳。首先确保系统已更新到最新补丁,然后下载与系统架构匹配的VS Code安装包,按照提示安装。安装后,注意某些扩展程序可能与Windows 8不兼容,需要寻找替代扩展或在虚拟机中使用更新的Windows系统。安装必要的扩展,检查是否正常工作。尽管VS Code在Windows 8上可行,但建议升级到更新的Windows系统以获得更好的开发体验和安全保障。

VS Code 扩展存在恶意风险,例如隐藏恶意代码、利用漏洞、伪装成合法扩展。识别恶意扩展的方法包括:检查发布者、阅读评论、检查代码、谨慎安装。安全措施还包括:安全意识、良好习惯、定期更新和杀毒软件。

在 VS Code 中,可以通过以下步骤在终端运行程序:准备代码和打开集成终端确保代码目录与终端工作目录一致根据编程语言选择运行命令(如 Python 的 python your_file_name.py)检查是否成功运行并解决错误利用调试器提升调试效率

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

VS Code 可用于编写 Python,并提供许多功能,使其成为开发 Python 应用程序的理想工具。它允许用户:安装 Python 扩展,以获得代码补全、语法高亮和调试等功能。使用调试器逐步跟踪代码,查找和修复错误。集成 Git,进行版本控制。使用代码格式化工具,保持代码一致性。使用 Linting 工具,提前发现潜在问题。

VS Code 可以在 Mac 上使用。它具有强大的扩展功能、Git 集成、终端和调试器,同时还提供了丰富的设置选项。但是,对于特别大型项目或专业性较强的开发,VS Code 可能会有性能或功能限制。

VS Code 运行 Jupyter Notebook 的关键是要确保 Python 环境正确配置,理解代码执行顺序与单元格顺序一致,并注意可能影响性能的大型文件或外部库。VS Code 提供的代码补全和调试功能可以大大提高编码效率和减少错误。
