Python+PyQt5自制监控小工具
作者:Sir 发布时间:2023-09-14 10:52:31
标签:Python,PyQt5,监控
本篇文章通过使用python实现对计算机摄像头的调用从而实现摄像监控的功能。
利用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_())
来源:https://mp.weixin.qq.com/s/v9wvqLCyM-kLPBS6-W7kCw


猜你喜欢
- 一个最最简单的例子:绘制一个从 0 到 360 度完整的 SIN 函数图形import numpy as npimport matplotl
- 本文实例为大家分享了mysql 5.6.17 安装教程简单版,供大家参考,具体内容如下1.linux版mysql下载(建议不要下5.7,安装
- 前言在我们抓取网页内容的时候,通常是抓取一整个页面的内容,而我们仅仅只是需要该网页中的部分内容,那该如何去提取呢?本章就带你学习xpath插
- 视觉设计是什么,人们怎么认为它的,自己又是怎么对待和理解它,它的核心价值是什么。视觉设计,冒似很艺术,跟艺术相关的职业,给大多数人的印象是做
- 异常描述有时我们的Excel有一个调整过自定义格式的日期字段:当我们用pandas读取时却是这样的效果:不管如何指定参数都无效。出现原因没有
- 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的 SELECT语句,另外一种就是更新语句,也叫做数据操作语句。言外之 意
- 本文实例讲述了django框架CSRF防护。分享给大家供大家参考,具体如下:CSRF防护一、什么是CSRF?CSRF: Cross-site
- Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime。time模块我在之前的文章已经有所介绍,它提
- 虽然初恋是java, 可是最近是越来越喜欢python,所以决定追根溯源好好了解下python的原理,架构等等.小脑袋瓜不太好使,只能记录下
- 1 map使用1.1 map定义map是一种无序的集合,对应的key (索引)会对应一个value(值),所以这个结构也称为关联数组或字典。
- tablewidgetpyqt5的tablewidget组件比较特殊,每个方格可以装载其他组件来搭配实现不同的效果,所以在qtdesigne
- 序言那个猥琐的家伙整天把个U盘藏着当宝,到睡觉了就拿出来插到电脑上。我决定想个办法看他U盘里都藏了什么,直接去抢U盘是不可能的,骗也是不可能
- 本文实例讲述了python3 property装饰器实现原理与用法。分享给大家供大家参考,具体如下:学习python的同学,慢慢的都会接触到
- 可视性的问题几乎在每次不同产品的用户测试中都会出现:用户总是对页面的某些元素、功能视若无睹,或根本无视。基于此,对这个问题进行了一番小小的研
- PHP _construct() 函数实例函数创建一个新的 SimpleXMLElement 对象,然后输出 body 节点的内容:<
- vue-i18n在单文件js中使用示例import Vue from 'vue'import VueI18n from
- 本文实例为大家分享了python自动化生成IOS的图标,供大家参考,具体内容如下每次上架之前都要生成十几个图片感觉无聊麻烦,考虑使用脚本处理
- 前言Laravel 队列为不同的后台队列服务提供统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系
- Terminal终端命令行Shell设置解决方案File --> Settings --> Tools --> Termi
- 目录一、Python 3.8 安装1.通过 Apt 安装Python3.82.配置 python3.8 为系统默认 python3二、卸载p