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
投稿
猜你喜欢
- 代码如下: Function closeHTML(strContent) Dim arrTags, i, OpenPos, ClosePos
- 对range()逆序的解释在 Python3.6 中,range() 函数返回一个可迭代的范围对象,范围类型表示不可变的数字序列,一般用在
- 这篇文章主要介绍了Python urlopen()和urlretrieve()用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作
- 1. 对于数组array乘就是对应位置的元素相乘:X1 = np.array([[1,2], [3, 4]])X2 = X1print X2
- 问题概述:有时候在使用print函数输出时,往往需要不断地切换字符串和变量,操作起来很不方便,需要不断地打引号和逗号。比如:firstNam
- 信息安全的核心就是数据库的安全,也就是说数据库加密是信息安全的核心问题。数据库数据的安全问题越来越受到重视,数据库加密技术的应用极大的解决了
- 前言众所周知字典(dict)对象是 Python 最常用的数据结构,社区曾有人开玩笑地说:"Python企图用字典装载整个世界&q
- 要使用request对象的ServerVariables属性,通过它来获得环境变量的值。使用的语法为:Request.ServerVaria
- 1 StreamingHttpResponse下载StreamingHttpResponse(streaming_content):流式相应
- 解决方法:1.首先你需要在自己的app下面创建2个目录 static 和 templatesstatic下存放静态文件,templates下
- 如下所示:<strong><span style="font-size:14px;">文本过滤&
- 例子:http.Handle("/tmpfiles/", http.StripPrefix("/tmpfile
- 使用timer来统计asp页面程序的运行时间。实例代码和说明见下:<%Dim varInitial_TimevarIniti
- 在上次的爬虫中,抓取的数据主要用到的是第三方的Beautifulsoup库,然后对每一个具体的数据在网页中的selecter来找到它,每一个
- 首先看一下这三个函数:rtrim() ltrim() trim();rtrim()定义以及用法: rtrim() 函数移除字符串右侧的空白字
- Francesc (@francesc) 是 Go 核心团队的一员, 是提倡 Google Cloud 平台的开发者. 他是一个编程语言的爱
- 最近做一个的GUI,因为调用了os模块里的system方法,使用pyinstaller打包的时候选择不输出系统命令弹框,程序无法运行,要求要
- subplot(arg1, arg2, arg3)arg1: 在垂直方向同时画几张图arg2: 在水平方向同时画几张图arg3: 当前命令修
- 前言和Word、Excel承载数据的能力相比,PPT的应用重点在于表演。比如一场发布会、一场演说、一次产品展示、一次客户沟通&hel
- 首先,为什么选择Tornado:1.高性能的网络库,这可以和gevent,twisted,libevent等做对。提供了异步io支持,超时事